自动发现项目中的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 请求转发到谷歌浏览器打开后变 ...
随机推荐
- 手机uc浏览器,获取到图片,但左上有小图标的问题
手机uc浏览器有个坑 获取不到图片,左上是这样的
- redis安装及简单命令
Redis 安装 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统 ...
- 【转】Linq 语法
Join操作符 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), Select ...
- 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "XXXView" nib but the view outlet was not set.' 崩溃问题
先说下我遇到这个崩溃问题的原因: 自定义的Viewxib和系统的 View重名,导致崩溃 我的理解是我这里加载YJLoginViewController 的时候,YJLoginViewControll ...
- React搭建脚手架
npm install -g create-react-app //安装 create-react-app react-demo // react-demo 项目的名称 cd react- ...
- <Android 基础(二)> BroadcastReceiver
介绍 BroadcastReceiver:广播接收者,很形象,广播发送,类比生活中的广播,有能力听得到的都可以介绍到这个信息,然后在大脑中反映.对应到Android中就是SendBroadcast和o ...
- RING3到RING0
当我在说跳转时,说的什么? CPU有很多指令,不是所有的指令都能够随时用,比如 ltr指令就不是随便什么时候能用,在保护模式下,如果你不安规则来执行指令,CPU就会抛出异常,比如你在INTEL手册上就 ...
- 索引是否也能提高UPDATE,DELETE,INSERT速度 解释
insert 不会提高,insert 用不到索引,只会增加维护索引的时间. update ,更新索引列不会提高,少量更新非索引列,会有提高 : 更新索引列,索引要重新维护,更新非索引列,倒是没什么影响 ...
- html常用的小技能
在html中有很多常用小技能,记下来,下次直接看自己的,就不用四处找啦! 1.<li>标签去掉点号:list-style-type:none; 去掉前: 去掉后: 2.<li> ...
- linux 命令——40 wc (转)
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...