Django自动获取项目中的全部URL

 1 import re
 2 from collections import OrderedDict
 3 from django.conf import settings
 4 from django.utils.module_loading import import_string
 5 # for django 1.0
 6 # from django.urls import RegexURLResolver, RegexURLPattern
 7 # for django 2.0
 8 from django.urls.resolvers import URLResolver, URLPattern
 9 
10 
11 def check_url_exclude(url):
12     """
13     排除一些特定的URL
14     :param url:
15     :return:
16     """
17     for regex in settings.AUTO_DISCOVER_EXCLUDE:
18         if re.match(regex, url):
19             return True
20 
21 
22 def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict):
23     """
24     递归的去获取URL
25     :param pre_namespace: namespace前缀,以后用户拼接name
26     :param pre_url: url前缀,以后用于拼接url
27     :param urlpatterns: 路由关系列表
28     :param url_ordered_dict: 用于保存递归中获取的所有路由
29     :return:
30     """
31     for item in urlpatterns:
32         if isinstance(item, URLPattern):  # 非路由分发,讲路由添加到url_ordered_dict
33             if not item.name:
34                 continue
35             if pre_namespace:
36                 name = "%s:%s" % (pre_namespace, item.name,)
37             else:
38                 name = item.name
39             if not item.name:
40                 raise Exception('URL路由中必须设置name属性')
41             url = pre_url + str(item.pattern)
42             url_ordered_dict[name] = {'name': name, 'url': url.replace('^', '').replace('$', '')}
43 
44         elif isinstance(item, URLResolver):  # 路由分发,递归操作
45             if pre_namespace:
46                 if item.namespace:
47                     namespace = "%s:%s" % (pre_namespace, item.namespace,)
48                 else:
49                     namespace = pre_namespace
50             else:
51                 if item.namespace:
52                     namespace = item.namespace
53                 else:
54                     namespace = None
55             recursion_urls(namespace, pre_url + str(item.pattern), item.url_patterns, url_ordered_dict)
56 
57 
58 def get_all_url_dict():
59     """
60     获取项目中所有的URL(必须有name别名)
61     :return:
62     """
63     url_ordered_dict = OrderedDict()
64 
65     md = import_string(settings.ROOT_URLCONF)  # from luff.. import urls
66     recursion_urls(None, '/', md.urlpatterns, url_ordered_dict)  # 递归去获取所有的路由
67 
68     return url_ordered_dict
原文地址:https://www.cnblogs.com/harryblog/p/10494519.html