获取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实现的最近最少使用算法
Jul 10 Python
python删除服务器文件代码示例
Feb 09 Python
Python3读取Excel数据存入MySQL的方法
May 04 Python
Python类和对象的定义与实际应用案例分析
Dec 27 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
pybind11在Windows下的使用教程
Jul 04 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
python实现学生管理系统开发
Jul 24 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 Python
python实现双链表
May 25 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中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
jQuery 添加/移除CSS类实现代码
2010/02/11 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
2015/05/07 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
Canvas 制作动态进度加载水球详解及实例代码
2016/12/09 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
angular实现spa单页面应用实例
2017/07/10 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
python实现数组插入新元素的方法
2015/05/22 Python
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
Python实现像awk一样分割字符串
2020/09/15 Python
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
平面设计求职信
2014/03/10 职场文书
《开国大典》教学反思
2014/04/19 职场文书
住宅质量保证书
2014/04/29 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
2015年化验室工作总结
2015/04/23 职场文书
民事代理词范文
2015/05/25 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技