Django3.2自动发现所有路由怎么实现
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要讲解了"Django3.2自动发现所有路由怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Django3.2自动发现所有路由怎么实现
千家信息网最后更新 2025年01月18日Django3.2自动发现所有路由怎么实现
这篇文章主要讲解了"Django3.2自动发现所有路由怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Django3.2自动发现所有路由怎么实现"吧!
1.需求
发现项目本地所有带别名的URL,组成一个有序字典,方便后续调用;
定向排除部分URL,如Django自带的 admin下的路由;
2.代码实现
import re # 正则from collections import OrderedDict # 创建有序字典from django.conf import settings # 导入setting配置文件(获取项目根路径urls.py)from django.utils.module_loading import import_string # 字符串导入模块from django.urls import URLPattern, URLResolver # Django自定义的类,可以判断当前URL是否为根路径(URLPattern)或继续向下分发(URLResolver )def check_url_exclude(url): """ 排除一些特定的URL :param url: 待检验的URL :return: """ for regex in settings.AUTO_DISCOVER_EXCLUDE: #将要定向排除的URL(可包含正则) 按照列表的形式写入配置文件 settings.AUTO_DISCOVER_EXCLUDE 下 if re.match(regex, url): return True"""示例:AUTO_DISCOVER_EXCLUDE = [ '/admin/.*', '/login/', '/logout/', '/index/',]"""def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict): """ 递归的去获取URL :param pre_namespace: namespace前缀,用于拼接name :param pre_url: url前缀,用于拼接url :param urlpatterns: 路由关系列表 :param url_ordered_dict: 用于保存递归中获取的所有路由 :return: """ for item in urlpatterns: if isinstance(item, URLPattern): # 已经是根网址,获取name及url写入url_ordered_dict if not item.name: # 没有别名(name)的路由地址直接跳过 continue # 拼接路由别名(包含分发下来的namespace;如 "rbac:menu_list") if pre_namespace: name = "%s:%s" % (pre_namespace, item.name) else: name = item.name # 拼接路由地址URl(包含分发下来的上层路由;如 "/rbac/menu/list") url = pre_url + item.pattern.regex.pattern # 此时拼接的路由包含起止符号,如:/^rbac/^menu/list/$ url = url.replace("^", "").replace("$", "") # 删除起止符:/rbac/menu/list/ # 排除一些特定的路由URL if check_url_exclude(url): # 调用check_url_exclude函数定向排除部分URL continue url_ordered_dict[name] = {"name": name, "url": url} elif isinstance(item, URLResolver): # 路由分发,递归操作 if pre_namespace: # 上次循环(上一层)分发是否包含namespace if item.namespace: # 本次循环(当前层)是否包含namespace namespace = "%s:%s" % (pre_namespace, item.namespace,) # 上层、当前层都包含直接拼接两层的namespace else: namespace = pre_namespace # 当前层分发不包含namespace,直接用上一层的 else: if item.namespace: namespace = item.namespace # 上一层分发不包含namespace,直接使用当前层的 else: namespace = None # 上一层、当前层都没有,直接定义层none recursion_urls(namespace, pre_url + item.pattern.regex.pattern, item.url_patterns, url_ordered_dict) # 递归继续执行def get_all_url_dict(): """ 获取项目所有路由 :return: """ url_ordered_dict = OrderedDict() # 包含本项目所有权限URl的有序字典 md = import_string(settings.ROOT_URLCONF) # 配置文件内的 ROOT_URLCONF 为本项目根路由urls.py 的路径(字符串),使用 import_string 用字符串加载模块 recursion_urls(None, "/", md.urlpatterns, url_ordered_dict) # 调用 recursion_urls 函数获取所有路由字典,根路径下没有namespace 定义为 None;没有url前缀 定义为 / return url_ordered_dict
感谢各位的阅读,以上就是"Django3.2自动发现所有路由怎么实现"的内容了,经过本文的学习后,相信大家对Django3.2自动发现所有路由怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
路由
项目
字典
路径
上一
递归
有序
别名
前缀
字符
字符串
文件
学习
配置
上层
内容
函数
地址
模块
正则
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
凡科数据库
什么是pubg测试服务器
数据库必须由三个
档案数据库的设计可以分为
网络安全防护功能宽度分配
2018网络安全设备排行
网络安全的利弊论文
学校网络安全意识教育的内容
数据库一个模式能有几个表
我的世界末影水晶服务器
食尚云配送软件开发
监控连数据库
大学生云计算创建第一台服务器
c语言和网络技术哪个好考
江苏互联网软件开发费用是多少
网络安全教育教学回顾
普陀区综合软件开发质量
pc如何设置私人服务器
软件开发菜鸟什么样子
常州网络技术服务多少钱
如何引用两个数据库中的表
软件开发发展走向
vmware服务器系统
网络安全奥斯卡
九方数据库
江苏互联网软件开发费用是多少
金砖会议网络安全
鳩鸠互联网科技公司
重庆王家庄大数据库
接到网络安全认证电话