Django3.2自动发现所有路由怎么实现
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要讲解了"Django3.2自动发现所有路由怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Django3.2自动发现所有路由怎么实现
千家信息网最后更新 2025年11月07日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安全错误
数据库的锁怎样保障安全
怎么看数据库有几个实例
湖北襄阳数据库
分布式数据库编程技术
软件开发主管个人工作总结
网络安全产品公司简介
小程序云函数读写数据库
怎样掌握网络技术
小学生网络安全讲座的内容
网络安全产品的发展方向
数据库技术支持待遇
网络安全模式可以玩游戏吗
cmd查看数据库运行数据
网络安全审计器
阿里云服务器遭攻击
就是生成数据库中所有用户的所有
济南网络安全学院东塔特训营
政府机关单位网络安全实施计划
中国高科技互联网公司排名
中间件及系统软件开发是做什么的
网络安全的手抄报写字内容
关于网络安全主题活动
三今网络技术有限公司大吗
解决网络安全的有效办法
连接数据库不成功
河源电商系统软件开发
福建邮件营销外贸软件开发
武汉网络安全管理学校
计算机的网络技术应用
服务器搭建与平常维护
数据库系统的目的