获取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之wxPython应用实例
Sep 28 Python
浅析Python中MySQLdb的事务处理功能
Sep 21 Python
Queue 实现生产者消费者模型(实例讲解)
Nov 13 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
Oct 11 Python
pandas 转换成行列表进行读取与Nan处理的方法
Oct 30 Python
python使用udp实现聊天器功能
Dec 10 Python
python3 xpath和requests应用详解
Mar 06 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
python 监控logcat关键字功能
Sep 04 Python
python音频处理的示例详解
Dec 23 Python
python字符串拼接.join()和拆分.split()详解
Nov 23 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关联数组快速排序的方法
2015/04/17 PHP
php微信公众账号开发之前五个坑(一)
2016/09/18 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
jQuery中的编程范式详解
2014/12/15 Javascript
微信小程序 图片宽高自适应详解
2017/05/11 Javascript
详解vue-cli3使用
2018/08/14 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
浅析Python中signal包的使用
2015/11/13 Python
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
2019/12/04 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
python实现马丁策略的实例详解
2021/01/15 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
中学生期末评语
2014/02/03 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
家长对孩子的感言
2014/03/10 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
学历证明范文
2015/06/16 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
Python Pandas常用函数方法总结
2021/06/15 Python
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python
css3新特性的应用示例分析
2022/03/16 HTML / CSS
《废话连篇——致新手》——chinapizza
2022/04/05 无线电