获取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实现文件分组复制到不同目录的例子
Jun 04 Python
分享一下Python 开发者节省时间的10个方法
Oct 02 Python
python简单实现获取当前时间
Aug 27 Python
Python xlwt设置excel单元格字体及格式
Apr 18 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
Python元组知识点总结
Feb 18 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
Jun 19 Python
python按比例随机切分数据的实现
Jul 11 Python
Django框架之登录后自定义跳转页面的实现方法
Jul 18 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 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
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
jquery.validate使用攻略 第一部
2010/07/01 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
jQuery实现带玻璃流光质感的手风琴特效
2015/11/20 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
2016/12/22 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
Python补齐字符串长度的实例
2018/11/15 Python
python实现连连看辅助(图像识别)
2020/03/25 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
美国运动鞋和服装网上商店:YCMC
2018/09/15 全球购物
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
师范生实习的个人自我鉴定
2013/10/20 职场文书
中国梦口号
2014/06/13 职场文书
迟到检讨书范文
2015/01/27 职场文书
公司人事管理制度
2015/08/05 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
Java Spring Lifecycle的使用
2022/05/06 Java/Android