获取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 相关文章推荐
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
python实现linux下使用xcopy的方法
Jun 28 Python
快速了解python leveldb
Jan 18 Python
python 通过字符串调用对象属性或方法的实例讲解
Apr 21 Python
Python判断两个list是否是父子集关系的实例
May 04 Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 Python
python leetcode 字符串相乘实例详解
Sep 03 Python
关于ResNeXt网络的pytorch实现
Jan 14 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
Jun 08 Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 Python
浅析Python模块之间的相互引用问题
Feb 26 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
动态网站web开发 PHP、ASP还是ASP.NET
2006/10/09 PHP
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
PHP抽象类 介绍
2012/06/13 PHP
七款最流行的PHP本地服务器分享
2013/02/19 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
Javascript 去除数组的重复元素
2010/05/04 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
2016/05/04 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
从零学Python之入门(四)运算
2014/05/27 Python
深入理解Python中各种方法的运作原理
2015/06/15 Python
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
浅谈python迭代器
2017/11/08 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
一看就懂得Python的math模块
2018/10/21 Python
Python ckeditor富文本编辑器代码实例解析
2020/06/22 Python
Python中logger日志模块详解
2020/08/04 Python
python如何停止递归
2020/09/09 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
印度最好的在线药品订购网站:PharmEasy
2018/11/30 全球购物
华为慧通笔试题
2016/04/22 面试题
《雪地里的小画家》教学反思
2014/02/22 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
隐形的翅膀观后感
2015/06/10 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript