获取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程序抓取网页的HTML信息的一个小实例
May 02 Python
浅析python递归函数和河内塔问题
Apr 18 Python
python对excel文档去重及求和的实例
Apr 18 Python
对python PLT中的image和skimage处理图片方法详解
Jan 10 Python
Django框架组成结构、基本概念与文件功能分析
Jul 30 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
Python的互斥锁与信号量详解
Sep 12 Python
使用Python串口实时显示数据并绘图的例子
Dec 26 Python
tensorflow常用函数API介绍
Apr 19 Python
Python实现仿射密码的思路详解
Apr 23 Python
Python脚本破解压缩文件口令实例教程(zipfile)
Jun 14 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 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
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
PHP安装攻略:常见问题解答(三)
2006/10/09 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
jquery UI 1.72 之datepicker
2009/12/29 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
Javascript事件实例详解
2013/11/06 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
关于layui 下拉列表的change事件详解
2019/09/20 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
Python实现代码统计工具
2019/09/19 Python
python通过实例讲解反射机制
2019/10/17 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
医学生自我鉴定范文
2013/11/08 职场文书
人力资源经理自我评价
2014/01/04 职场文书
幼儿园教师教育感言
2014/02/28 职场文书
专项法律服务方案
2014/06/11 职场文书
出纳岗位职责
2015/01/31 职场文书
雾霾停课通知
2015/04/24 职场文书
蜗居观后感
2015/06/11 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书