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