django2、3 自动发现项目中的url
根据路飞学城luffycity.com 的crm项目修改的
1 url入口:rbac/urls.py
urlpatterns = [ ... # 批量操作权限 re_path(r '^multi/permissions/$' , menu.multi_permissions, name = 'multi_permissions' ) # 自动发现项目中的所有URL ... ] |
2 配置文件 settings
不用发现的url列表: AUTO_DISCOVER_EXCLUDE = [ '/admin/' , '/login/' , ] |
3 自定发现url的组件:rbac/service/router.py#!/usr/bin/env # -*- coding:utf-8 -*-__author__ = 'mosson'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | <em id = "__mceDel" ><em id = "__mceDel" ><em id = "__mceDel" > import re from collections import OrderedDict from django.conf import settings from django.utils.module_loading import import_string from django.urls.resolvers import URLResolver, URLPattern # 路由分发:URLResolver。非路由分发:URLPattern def check_url_exclude(url): """ 查看被排除在外的url :param url: :return: """ for regex in settings.AUTO_DISCOVER_EXCLUDE: if re.match(regex, url): return True 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: 用于保存递归中获取的所有的url :return: """ for item in urlpatterns: if isinstance (item, URLPattern): #非路由分发 添加到字典url_ordered_dict中 if not item.name: continue if pre_namespace: name = "%s:%s" % (pre_namespace, item.name) else : name = item.name url = pre_url + item.pattern._route # str(item.pattern) 写法不规范,参考下面的 item.pattern._route<br> url = url.replace( "^" , " ").replace(" $ ", " ") if check_url_exclude(url): # 判断是否admin、login等我们不需要的url,是的话直接跳过 continue url_ordered_dict[name] = { 'name' :name, 'url' :url} elif isinstance (item, URLResolver): # 路由分发, 继续递归 if pre_namespace: if item.namespace: namespace = f "{pre_namespace}:{item.namespace}" else : namespace = pre_namespace else : if item.namespace: namespace = item.namespace else : namespace = None # 父级没有namespace,自己也没有 recursion_urls(namespace, pre_url + str (item.pattern), item.url_patterns, url_ordered_dict) def get_all_url(): """ 获取所有的url :return: """ url_ordered_dict = OrderedDict() md = import_string(settings.ROOT_URLCONF) # 递归获取所有的url recursion_urls( None , '/' , md.urlpatterns, url_ordered_dict) return url_ordered_dict < / em>< / em>< / em> |
4 视图函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from rbac.service.router import get_all_url_dict def multi_permissions(request): """ 批量操作权限 :param request: :return: """ # 获取项目中所有的url all_url_dict = get_all_url_dict() for k, v in all_url_dict.items(): print (k, v) return HttpResponse( 'ok it' ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了