自动发现项目中的URL,django1版本和django2版本
一、django 1 版本
routers.py
import re
from collections import OrderedDict from django.conf import settings
from django.utils.module_loading import import_string # 根据字符串的形式,帮我们去导入模块
from django.urls import RegexURLResolver, RegexURLPattern # 路由分发:URLResolver。不是路由分发:URLPattern def check_url_exclude(url):
"""
排除一些特定的url
:param url:
:return:
"""
exclude_url = [
'/admin.*',
'/login/'
]
for regex in settings.AUTO_DISCOVER_EXCLUDE:
if re.match(regex, url):
return True def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict):
""" :param pre_namespace: namespace前缀(rbac:......),以后用于拼接name
:param pre_url: url的前缀(rbac/......),以后用于拼接url
:param urlpatterns: 路由关系列表
:param url_ordered_dict: 用于保存递归中获取的所有路由
:return:
"""
for item in urlpatterns:
if isinstance(item,RegexURLPatter): # 非路由分发,将路由添加到url_ordered_dict
if not item.name: # url中反向命名的name
continue
if pre_namespace:
name = f"{pre_namespace}:{item.name}"
else:
name = item.name
url = pre_url + item._regex # /^rbac/^user/edit/(?P<pk>\d_+)/$
url = url.replace('^', '').replace('$', '') # /rbac/user/edit/(?P<pk>\d_+)/ if check_url_exclude(url):
continue
url_ordered_dict[name] = {'name': name, 'url': url} elif isinstance(item, RegexURLResolver): # 路由分发,进行递归操作
if pre_namespace:
if item.namespace:
namespace = f"{pre_namespace}:{item.namespace}"
else:
namespace = item.namespace
else:
if item.namespace:
namespace = item.namespace
else:
namespace = None
recursion_urls(namespace, pre_url + item.regex.pattern, item.url_patterns, url_ordered_dict) def get_all_url_dict():
"""
获取项目中所有的URL(必须有name别名)
:return:
"""
url_ordered_dict = OrderedDict()
"""
{
'rbac:menu_list':{name:'rbac:menu_list',url:'xxxxx/yyyy/menu/list'}
}
""" md = import_string(settings.ROOT_URLCONF) # from permision_learn import urls recursion_urls(None, '/', md.urlpatterns, url_ordered_dict) # 递归的去获取所有的路由。根目录没有namespace,根路由用/ return url_ordered_dict
views.py
def multi_permissions(request):
"""
批量操作权限
:param request:
:return:
""" # 获取项目中所有的url all_url_dict = get_all_url_dict() for k, v in all_url_dict.items():
print(k, v) return HttpResponse('....')
二、django 2版本
django 2版本有些坑,和django 1版本的用法略有不同。谷歌查了半天,只查到模块名变了,没查到用法。没办法,只能取看源码,只能看到参数名变了,瞎试了试,居然能用。
routers.py
import re
from collections import OrderedDict from django.conf import settings
from django.utils.module_loading import import_string # 根据字符串的形式,帮我们去导入模块
from django.urls import URLPattern, URLResolver # 路由分发:URLResolver。不是路由分发:URLPattern def check_url_exclude(url):
"""
排除一些特定的url
:param url:
:return:
"""
exclude_url = [
'/admin.*',
'/login/'
]
for regex in settings.AUTO_DISCOVER_EXCLUDE:
if re.match(regex, url):
return True def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict):
""" :param pre_namespace: namespace前缀(rbac:......),以后用于拼接name
:param pre_url: url的前缀(rbac/......),以后用于拼接url
:param urlpatterns: 路由关系列表
:param url_ordered_dict: 用于保存递归中获取的所有路由
:return:
"""
for item in urlpatterns:
if isinstance(item, URLPattern): # 非路由分发,将路由添加到url_ordered_dict
if not item.name: # url中反向命名的name
continue
if pre_namespace:
name = f"{pre_namespace}:{item.name}"
else:
name = item.name
url = pre_url + item.pattern.regex.pattern # /^rbac/^user/edit/(?P<pk>\d_+)/$
url = url.replace('^', '').replace('$', '') # /rbac/user/edit/(?P<pk>\d_+)/ if check_url_exclude(url):
continue
url_ordered_dict[name] = {'name': name, 'url': url} elif isinstance(item, URLResolver): # 路由分发,进行递归操作
if pre_namespace:
if item.namespace:
namespace = f"{pre_namespace}:{item.namespace}"
else:
namespace = item.namespace
else:
if item.namespace:
namespace = item.namespace
else:
namespace = None
recursion_urls(namespace, pre_url + item.pattern.regex.pattern, item.url_patterns, url_ordered_dict) def get_all_url_dict():
"""
获取项目中所有的URL(必须有name别名)
:return:
"""
url_ordered_dict = OrderedDict()
"""
{
'rbac:menu_list':{name:'rbac:menu_list',url:'xxxxx/yyyy/menu/list'}
}
""" md = import_string(settings.ROOT_URLCONF) # from permision_learn import urls recursion_urls(None, '/', md.urlpatterns, url_ordered_dict) # 递归的去获取所有的路由。根目录没有namespace,根路由用/ return url_ordered_dict
views.py
def multi_permissions(request):
"""
批量操作权限
:param request:
:return:
""" # 获取项目中所有的url all_url_dict = get_all_url_dict() for k, v in all_url_dict.items():
print(k, v) return HttpResponse('....')
自动发现项目中的URL,django1版本和django2版本的更多相关文章
- django2自动发现项目中的url
根据路飞学城luffycity.com 的crm项目修改的 1 url入口:rbac/urls.py urlpatterns = [ ... # 批量操作权限 re_path(r'^multi/per ...
- 自动发现项目中的url
def check_url_exclude(url): """ 判断url是否需要自动被发现,如果不是则移除 :param url: 自动发现的url :return: ...
- 自动发现项目中的所有URL
我的rbac组件,是想用到任何一个,项目中的. so 问题来了. - 问题: 拿到一个项目. 怎样获取到,当前项目中, 所有的URL 以及 每个URL的别名name, 还有是有 namespace 命 ...
- 权限组件(12):自动发现项目中有别名的URL
自动发现项目中所有有别名的URL,效果如下: customer_list {'name': 'customer_list', 'url': '/customer/list/'} customer_ad ...
- 怎么查看CI,codeigniter的版本信息?想看某个项目中使用的CI具体是哪个版本,怎么查看?
怎么查看CI的版本信息?想看某个项目中使用的CI具体是哪个版本,怎么查看?system\core\codeigniter.php中可以查看版本常量/** * CodeIgniter Version * ...
- Django自动获取项目中的全部URL
import re from collections import OrderedDict from django.conf import settings from django.utils.mod ...
- [Vscode插件] 自动编译项目中的Sass文件为CSS
插件名 : Live Sass Compiler 今天在VSCode中发现了一个自动watch项目目录下sass文件的插件,摆脱了在控制台中进行手动watch的繁琐. 安装好以后点击右下角即可自动编译 ...
- 安装使用Entity Framework Power Tool Bate4 (Code First)从已建好的数据自动生成项目中的对应Model(新手贴,望各位大侠给予指点)
从开始学习使用MVC以后,同时也开始接触EF,很多原理都不是太懂,只知道安装了EF以后,点击哪里可以生成数据库对应的Model,不用再自己手写Model.这里记录的就是如何从已建立好的数据库生成项目代 ...
- 浏览器自动将参数中的url转码问题
遇到一个问题, 开始的url如下: http://localhost:6666/pages/wxpay.html? code_url=weixin://wxpay/biz 请求转发到谷歌浏览器打开后变 ...
随机推荐
- 面试大全之JVM篇
JVM 内存模型以及分区,需要详细到每个区放什么. JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面,class类信息常量池(static常量和static变量)等放在方法区 ...
- 解决Spring JdbcTemplate调用queryForObject()方法结果集为空时报异常
JdbcTemplate用的时候发现一个问题:调用queryForObject()方法,如果没有查到东西则会抛一个异常:org.springframework.dao.EmptyResultDataA ...
- Oracle之rman数据库在非归档模式下的备份和恢复
1.数据库在非归档模式下的备份 SQL> archive log list;数据库日志模式 非存档模式自动存档 禁用存档终点 USE_DB_RECOVERY_FILE_DEST最早的联机日志序列 ...
- Python3基础(5)常用模块:time、datetime、random、os、sys、shutil、shelve、xml处理、ConfigParser、hashlib、re
---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...
- Docker:安装部署RabbitMQ
前言 今天原本想讲解SpringBoot集成RabbitMQ的,临近开始写时才发现家里的电脑根本没有安装RabbitMQ呀.这下只好利用已有的阿里云服务器,直接Docker安装一下了,顺道记录下,算是 ...
- Day1下午
T1 暴力50分 排A和B X,不用考虑X 用数组80分, 权值线段树.平衡树100, 一个函数? T2 打表 dp logn+1,+ 搜索,dp? txt..... T3 30分暴力和尽量均 ...
- ORA-02298: 无法验证 (约束) - 未找到父项关键字 解决办法
--在用PL/SQL导入表数据的时候报错 ORA-02298: 无法验证 (PNET.POST_CLOB_FK) - 未找到父项关键字 --发现是启用外键约束时报的错alter table DM_VO ...
- 【Shell脚本学习22】Shell 函数:Shell函数返回值、删除函数、在终端调用函数
函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: f ...
- javascript HTML静态页面传值的四种方法
一:JavaScript静态页面值传递之URL篇能过URL进行传值.把要传递的信息接在URL上.Post.htm 代码如下: <input type="text" name= ...
- pta 编程题7 List Leaves
其它pta数据结构编程题请参见:pta 这次的编程作业要求从上到下,从左到右输出一棵树的叶子节点,即树的层序遍历,用队列的方式来实现. 注意enqueue和dequeue函数参数为Queue & ...