获取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自带PIL库扩展图片大小给图片加文字描述的方法示例
Aug 08 Python
Python 网页解析HTMLParse的实例详解
Aug 10 Python
Python面向对象之接口、抽象类与多态详解
Aug 27 Python
Python的iOS自动化打包实例代码
Nov 22 Python
Python3实现腾讯云OCR识别
Nov 27 Python
深入了解和应用Python 装饰器 @decorator
Apr 02 Python
python flask解析json数据不完整的解决方法
May 26 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
Jun 12 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
Jun 14 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
Mar 30 Python
Python通过两个dataframe用for循环求笛卡尔积
Apr 29 Python
Python实现发票自动校核微信机器人的方法
May 22 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读MYSQL中文乱码的解决方法
2006/12/17 PHP
提高PHP编程效率 引入缓存机制提升性能
2010/02/15 PHP
php实现用户在线时间统计详解
2011/10/08 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
javascript基本算法汇总
2016/03/09 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
[41:17]VG vs Optic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python中字典的基本知识初步介绍
2015/05/21 Python
使用Python3编写抓取网页和只抓网页图片的脚本
2015/08/20 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
Python读写文件模式和文件对象方法实例详解
2019/09/17 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
北京大学自荐信范文
2014/01/28 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
学校食品安全实施方案
2014/06/14 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2015年保管员工作总结
2015/04/30 职场文书
人与自然的观后感
2015/06/18 职场文书
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技