zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    将对象转成 json 以及 将字符串 hash(SHA1) 加密
    Model First 开发方式
    DataSet结果转模型类
    Table 类(数据表基类)
    只返回数据表的部分字段(不建类)
    修改数据表部分字段方法封装-及-动态生成对象并动态添加属性
    封装方法:通过方法名调用类内的方法
    同步 VS 异步
    使用 Lambda表达式替换使用 ElemMatch 的方式查询集合类型的字段是否符合某条件
    使用Newtonsoft.Json将数据导出至Json文件
  • 原文地址:https://www.cnblogs.com/harryblog/p/10494519.html
Copyright © 2011-2022 走看看