千家信息网

Django3.2自动发现所有路由怎么实现

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要讲解了"Django3.2自动发现所有路由怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Django3.2自动发现所有路由怎么实现
千家信息网最后更新 2026年10月31日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安全错误 数据库的锁怎样保障安全 天津市摩尔互联网科技 互联网品科技 重庆互联网络科技 互联网科技公司发展 杭州互联网科技公司 小马过河互联网科技 佰商互联网科技有限公司 互联网科技有限公司 翻译 银川新华互联网科技学校地址 华服互联网科技官网 彤创互联网科技有限公司 世界互联网科技公司市值排名 宝灵互联网科技有限公司 电子科技大学互联网创业大赛 乌苏新华互联网科技做什么的 华夏恒生科技与互联网科技 徐州市互联网科技有限公司 区块链结合互联网科技 济南小医互联网科技有限公司招聘 张家口科技产业互联网平台 美国互联网黑科技 深圳天众互联网科技公司 互联网科技英文翻译 互联网和高科技公司 互联网科技博主是什么意思 互联网和黑科技的看法 彤创互联网科技有限公司 为客找房互联网科技公司怎么样 下一代互联网重大应用科技园 互联网公司属于科技吗
0