获取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内置数据类型详解
Aug 18 Python
在Python中用get()方法获取字典键值的教程
May 21 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 Python
详谈python3 numpy-loadtxt的编码问题
Apr 29 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
Dec 20 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
Aug 26 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
多个python文件调用logging模块报错误
Feb 12 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
python中有帮助函数吗
Jun 19 Python
Python unittest装饰器实现原理及代码
Sep 08 Python
Django正则URL匹配实现流程解析
Nov 13 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实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
yii2使用gridView实现下拉列表筛选数据
2017/04/10 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
axios学习教程全攻略
2017/03/26 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
JS如何调用WebAssembly编译出来的.wasm文件
2020/11/05 Javascript
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
使用Django启动命令行及执行脚本的方法
2018/05/29 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
Python 列表的清空方式
2020/01/13 Python
Django 返回json数据的实现示例
2020/03/05 Python
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
面试后感谢信怎么写
2014/02/01 职场文书
汉语言文学职业规划
2014/02/14 职场文书
还款承诺书范文
2014/05/20 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
刑事申诉状范文
2015/05/20 职场文书