#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
from collections import OrderedDict
from django.conf import settings
from django.utils.module_loading import import_string
from django.urls import RegexURLResolver, RegexURLPattern
def check_url_exclude(url):
"""
排除一些特定的URL
:param url:
:return:
"""
for regex in settings.AUTO_DISCOVER_EXCLUDE:
'''
AUTO_DISCOVER_EXCLUDE = [
'/admin/.*',
'/login/',
'/logout/',
'/index/',
]
'''
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: 用於保存遞歸中獲取的所有路由
:return:
"""
for item in urlpatterns:
if isinstance(item, RegexURLPattern): # 非路由分發,講路由添加到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._regex # /rbac/user/edit/(?P<pk>\d+)/
url = url.replace('^', '').replace('$', '')
if check_url_exclude(url):
continue
url_ordered_dict[name] = {'name': name, 'url': url}
elif isinstance(item, RegexURLResolver): # 路由分發,遞歸操作
if pre_namespace:
if item.namespace:
namespace = "%s:%s" % (pre_namespace, item.namespace,)
else:
namespace = item.namespace
else:
if item.namespace:
namespace = item.namespace
else:
namespace = None
recursion_urls(namespace, pre_url + item.regex.pattern, item.url_patterns, url_ordered_dict)
def get_all_url_dict():
"""
獲取項目中所有的URL(必須有name別名)
:return:
"""
url_ordered_dict = OrderedDict()
md = import_string(settings.ROOT_URLCONF) # from luff.. import urls
recursion_urls(None, '/', md.urlpatterns, url_ordered_dict) # 遞歸去獲取所有的路由
print(url_ordered_dict)
return url_ordered_dict
https://www.cnblogs.com/harryblog/p/10494519.html