文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-21 22:56

关注

这篇文章主要讲解了“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自动发现所有路由怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯