# Django2
# from django.urls import URLPattern, URLResolver
# Django1
from django.conf.urls import RegexURLPattern, RegexURLResolver
from collections import OrderedDict
from django.conf import settings
import sys
from django.utils.module_loading import import_string
def check_url_exclude(url_info):
"""
排除一些特定的URL
:param url:
:return:
"""
url_list = []
for key in url_info:
if 'admin:' in key:
continue
else:
url_list.append(url_info.get(key))
return url_list
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:
resquest_methods = []
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
if not item.name:
raise Exception('URL路由中必须设置name属性')
if hasattr(sys.modules[item.callback.__module__], item.callback.__name__):
methods = dir(getattr(sys.modules[item.callback.__module__], item.callback.__name__))
for method in settings.MEEHOD_LIST:
if method in methods:
resquest_methods.append(method)
url = pre_url + str(item.regex.pattern)
url_ordered_dict[name] = {'name': name, 'url': url.replace('^', '').replace('$', ''),'rmethods':resquest_methods}
elif isinstance(item, RegexURLResolver): # 路由分发,递归操作
if pre_namespace:
if item.namespace:
namespace = "%s:%s" % (pre_namespace, item.namespace,)
else:
namespace = pre_namespace
else:
if item.namespace:
namespace = item.namespace
else:
namespace = None
recursion_urls(namespace, pre_url + str(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) # 递归去获取所有的路由
url_list = check_url_exclude(url_ordered_dict)
return url_list