Django3.2自动发现所有路由怎么实现
发表于:2025-02-22 作者:千家信息网编辑
千家信息网最后更新 2025年02月22日,这篇文章主要讲解了"Django3.2自动发现所有路由怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Django3.2自动发现所有路由怎么实现
千家信息网最后更新 2025年02月22日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安全错误
数据库的锁怎样保障安全
鲨氪网络技术有限公司
pc服务器软件开发
软件开发部管理制度百度文档
匿名访问web服务器
金融科技和互联网合作
计算机网络技术空军
数据库资产信息
网络技术 三级试题
网络安全监测响应知识
云南网络技术服务平台
服务器和域名
海媚服务器KTV房间无歌曲
网络安全协议原理结构与应用答案
常州工业网络技术服务
数据库加快查询
金山区企业网络技术咨询诚信合作
网络安全应急演练记录表怎么写
数据库做开始记录
金融类软件开发面试题目
网络安全 自主可控概念股
诛仙单机版自设服务器
lol更新经常显示连接服务器
国家网络安全风险评估
贵州服务器机房直销价格
网络技术 三级试题
新浪邮箱收件服务器
中等专学校数据库
南昌混合现实软件开发
计算机网络技术基础知识教学
服务器盘柜怎么改普通电脑