Django如何实现自动发现路由,方法是什么
Admin 2022-06-28 群英技术资讯 279 次浏览
发现项目本地所有带别名的URL,组成一个有序字典,方便后续调用;
定向排除部分URL,如Django自带的 admin下的路由;
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
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章给大家分享的是如何用怎样用python绘制雷达图的内容。雷达图相比其他标图有其优势和特点,能应用的场景也很多,小编觉得挺实用的,因此分享给大家做个参考,接下来一起跟随小编看看吧。
这篇文章主要介绍了Python画图练习案例分享,文章基于Python实现各种画图,具有一定的参考价值,感兴趣的小伙伴可以参考一下
这篇文章主要为大家介绍了Python中非常好用的内置函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
这篇文章主要介绍了Python应用之利用pyecharts画中国地图,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
None是python中的一个特殊的常量,表示一个空的对象。空值是Python中的一个特殊值,数据为空并不代表是空对象,例如[],'',(),{}等都不是None。None是NoneType数据类型的唯一值(其他编程语言可能称这个值为null、nil或undefined),也就是说,我们不能再创建其它NoneType类型的变量,但是可以将None赋值给任何变量。如果希望变量中
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008