获取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中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
利用python实现简单的邮件发送客户端示例
Dec 23 Python
python正则表达式爬取猫眼电影top100
Feb 24 Python
Python利用Django如何写restful api接口详解
Jun 08 Python
浅谈Python traceback的优雅处理
Aug 31 Python
在cmder下安装ipython以及环境的搭建
Oct 19 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
Aug 27 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
将matplotlib绘图嵌入pyqt的方法示例
Jan 08 Python
使用TensorBoard进行超参数优化的实现
Jul 06 Python
浅析python函数式编程
Sep 26 Python
python神经网络学习 使用Keras进行回归运算
May 04 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中使用Oracle数据库(1)
2006/10/09 PHP
将OICQ数据转成MYSQL数据
2006/10/09 PHP
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
PHP自定义大小验证码的方法详解
2013/06/07 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
2013/06/14 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
Smarty保留变量用法分析
2016/05/23 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
JavaScript打字小游戏代码
2011/12/26 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
vue实现侧边栏导航效果
2019/10/21 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
2020/12/14 Vue.js
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
python基础教程之字典操作详解
2014/03/25 Python
在Windows8上的搭建Python和Django环境
2014/07/03 Python
python计算N天之后日期的方法
2015/03/31 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
2018/10/16 Python
django框架防止XSS注入的方法分析
2019/06/21 Python
python 代码运行时间获取方式详解
2020/09/18 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
美国领先的奢侈美容零售商:Bluemercury
2017/07/26 全球购物
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
医校毕业生自我鉴定
2014/01/25 职场文书
学校党员对照检查材料
2014/08/28 职场文书
美术教师求职信范文
2015/03/20 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书
MySQL数据库之内置函数和自定义函数 function
2022/06/16 MySQL