获取Django项目的全部url方法详解


Posted in Python onOctober 26, 2017

在为一个项目添加权限时,遇到一个问题,就是为项目所有的url设置权限,但是一个一个手动输入太麻烦了,所以考虑用代码获取到一个项目所有的url

首先,考虑到项目最外层的urlpartterns,因为所有的url都要通过这里

urlpatterns = [
  # url(r'^admin/', admin.site.urls),
  url(r'^arya/', site.urls),
  url(r'^index/', index),
]

先循环打印一下这个列表,看一下拿到的结果:

<RegexURLResolver <RegexURLPattern list> (arya:arya) ^arya/>
<RegexURLResolver <module 'rbac.urls' from 'C:\\Users\\zhangcan\\Desktop\\pro_crm\\pro_crm\\rbac\\urls.py'> (None:None) ^rbac/>
<RegexURLPattern None ^index/>

可以看到,直接有对应函数的和通过文件导入的这种嵌套的,打印出来的类型是不一样的,导入一下这个类型

from django.urls.resolvers import RegexURLPattern
from django.urls.resolvers import RegexURLResolver

按住ctrl点进去看一下源码,找来找去看到有个

self._regex = regex

拿到代码中打印一下这个,拿到:

^arya/
^rbac/
^index/

哇,妙啊,但是这个只能是最后一个有用,上面两个还有嵌套,我们通过上面拿到的两种类型区分一下

对于这种有嵌套的,可以使用递归来一层一层的扒开它,直到拿到的是  RegexURLPattern  类型

而且,每扒开一层,它的url得加上之前的那个

我们可以通过   item.urlconf_name   拿到嵌套的里面一层的urlpartterns

这里面还涉及一个问题就是,用递归函数的话,如何保存每次得到的结果?

可以用一个全局变量,没有问题,其实还可以用一个Python的特性,就是如果参数的默认值为字典,列表这种可变数据类型的话,以后引用的都是同一个内存地址

所以这个全局变量还可以写成是一个默认是个空列表的参数,但是这样又出了新的问题,就是只要不重启项目,这个列表一直不清空,所以再用一个默认参数为False,第一次调用的时候把这个参数设置为True,在函数中判断如果这个参数为True,就清空列表。

最终代码可以写成这样:

from django.conf.urls import url,include
from arya.service.sites import site
from django.urls.resolvers import RegexURLPattern
from django.urls.resolvers import RegexURLResolver
from django.shortcuts import HttpResponse
def index(request):
  print(get_all_url(urlpatterns,prev='/'))
  return HttpResponse('...')
def get_all_url(urlparrentens,prev,is_first=False,result=[]):
  if is_first:
    result.clear()
  for item in urlparrentens:
    v = item._regex.strip('^$')#去掉url中的^和$
    if isinstance(item,RegexURLPattern):
      result.append(prev + v)
    else:
      get_all_url(item.urlconf_name,prev + v)
  return result
urlpatterns = [
  url(r'^arya/', site.urls),
  url(r'^index/', index),
]

这样就拿到了这个项目所有的url

['/arya/login/', '/arya/logout/', '/arya/app01/department/', '/arya/app01/department/add/', '/arya/app01/department/(.+)/delete/', '/arya/app01/department/(.+)/change/', '/arya/app01/userinfo/', '/arya/app01/userinfo/add/', '/arya/app01/userinfo/(.+)/delete/', '/arya/app01/userinfo/(.+)/change/', '/arya/rbac/userinfo/', '/arya/rbac/userinfo/add/', '/arya/rbac/userinfo/(.+)/delete/', '/arya/rbac/userinfo/(.+)/change/', '/arya/rbac/role/', '/arya/rbac/role/add/', '/arya/rbac/role/(.+)/delete/', '/arya/rbac/role/(.+)/change/', '/arya/rbac/permission/', '/arya/rbac/permission/add/', '/arya/rbac/permission/(.+)/delete/', '/arya/rbac/permission/(.+)/change/', '/arya/rbac/menu/', '/arya/rbac/menu/add/', '/arya/rbac/menu/(.+)/delete/', '/arya/rbac/menu/(.+)/change/', '/index/']

总结

以上就是本文关于获取Django项目的全部url方法详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python探索之ModelForm代码详解、基于Python和Scikit-Learn的机器学习探索等,如有不足之处,欢迎大家留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Linux下编译安装MySQL-Python教程
Feb 02 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 Python
Python标准库笔记struct模块的使用
Feb 22 Python
python-opencv颜色提取分割方法
Dec 08 Python
pycharm 实现显示project 选项卡的方法
Jan 17 Python
在Keras中利用np.random.shuffle()打乱数据集实例
Jun 15 Python
python实现从ftp上下载文件的实例方法
Jul 19 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 Python
Python SMTP发送电子邮件的示例
Sep 23 Python
Python实现淘宝秒杀功能的示例代码
Jan 19 Python
利用Opencv实现图片的油画特效实例
Feb 28 Python
TensorFlow中tf.batch_matmul()的用法
Jun 02 Python
Python探索之ModelForm代码详解
Oct 26 #Python
启动targetcli时遇到错误解决办法
Oct 26 #Python
Mac中Python 3环境下安装scrapy的方法教程
Oct 26 #Python
python实现分页效果
Oct 25 #Python
python+pyqt实现12306图片验证效果
Oct 25 #Python
python编程羊车门问题代码示例
Oct 25 #Python
python中requests使用代理proxies方法介绍
Oct 25 #Python
You might like
功能齐全的PHP发送邮件类代码附详细说明
2008/07/10 PHP
PHP Squid中可缓存的动态网页设计
2008/09/17 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
2011/11/25 PHP
php 生成短网址原理及代码
2014/01/23 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
jQuery使用手册之 事件处理
2007/03/24 Javascript
javascript 网页跳转的方法
2008/12/24 Javascript
javascript 获取表单file全路径
2009/12/31 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
JavaScript中获取样式的原生方法小结
2014/10/08 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
Angular2安装angular-cli
2017/05/21 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
js实现跳一跳小游戏
2020/07/31 Javascript
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
Python通过文本和图片生成词云图
2020/05/21 Python
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
资料员的岗位职责
2013/11/20 职场文书
青年教师典范事迹材料
2014/01/31 职场文书
中学校庆方案
2014/03/17 职场文书
邓小平理论心得体会
2014/09/09 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python
Ajax实现三级联动效果
2021/10/05 Javascript