获取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 相关文章推荐
python和bash统计CPU利用率的方法
Jul 10 Python
python二分查找算法的递归实现方法
May 12 Python
python利用拉链法实现字典方法示例
Mar 25 Python
Python内置模块turtle绘图详解
Dec 09 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
Python数据类型之Dict字典实例详解
May 07 Python
pygame实现五子棋游戏
Oct 29 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
Apr 27 Python
解决python调用自己文件函数/执行函数找不到包问题
Jun 01 Python
Python hashlib和hmac模块使用方法解析
Dec 08 Python
Python将QQ聊天记录生成词云的示例代码
Feb 10 Python
Pytest中skip skipif跳过用例详解
Jun 30 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
我的论坛源代码(七)
2006/10/09 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
php实现的mongodb操作类
2015/05/28 PHP
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
jQuery 行级解析读取XML文件(附源码)
2009/10/12 Javascript
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
IE bug table元素的innerHTML
2010/01/11 Javascript
javascript 常用功能总结
2012/03/18 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
2014/05/27 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
老生常谈遮罩层 滚动条的问题
2016/04/29 Javascript
js创建数组的简单方法
2016/07/27 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
JavaScript函数Call、Apply原理实例解析
2020/02/17 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
Python import自定义模块方法
2015/02/12 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
python 图像平移和旋转的实例
2019/01/10 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
HTML5和CSS3实例教程总结(推荐)
2016/07/18 HTML / CSS
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
商务英语专业自荐信
2013/10/14 职场文书
人事助理岗位职责
2013/11/18 职场文书
实习评语大全
2014/04/26 职场文书
react antd实现动态增减表单
2021/06/03 Javascript
sql字段解析器的实现示例
2021/06/23 SQL Server