django路由分发1中RegexURLResolver, RegexURLPattern和2中URLResolver, URLPattern
2021/5/9 10:25:56
本文主要是介绍django路由分发1中RegexURLResolver, RegexURLPattern和2中URLResolver, URLPattern,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
话不多说,直接上代码
from django.conf import settings from django.utils.module_loading import import_string from django.urls import RegexURLResolver, RegexURLPattern from collections import OrderedDict def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict): #None, "/", urlpatterns, url_ordered_dict # 递归第二层 #'rbac', "/", rbac.urls.urlpatterns, url_ordered_dict for item in urlpatterns: #w eb.urls.urlpatterns ''' [ # url(r'^login/$', auth.login,name='login'), -- RegexURLPattern url(r'^role/list/', views.role_list,name='role_list'), ] ''' if isinstance(item, RegexURLResolver): if pre_namespace: if item.namespace: namespace = "%s:%s" % (pre_namespace, item.namespace,) #'rbac':'rbac' else: namespace = pre_namespace # 'rbac' else: if item.namespace: #'rbac' namespace = item.namespace #'rbac' else: namespace = None # None, "/^", urlpatterns, url_ordered_dict recursion_urls(namespace, pre_url + item.regex.pattern, item.url_patterns, url_ordered_dict) #'/'+'^'--'/^', else: if pre_namespace: #None name = "%s:%s" % (pre_namespace, item.name,) else: name = item.name #name = 'login' if not item.name: raise Exception('URL路由中必须设置name属性') url = pre_url + item._regex #'^login/$'-- #/^^login/$ url_ordered_dict[name] = {'url_name': name, 'url': url.replace('^', '').replace('$', '')} # #url_ordered_dict['login'] = {'name': 'login', 'url': url.replace('^', '').replace('$', '')} #/login/ def get_all_url_dict(ignore_namespace_list=None): """ 获取路由中 :return: """ ignore_list = ignore_namespace_list or [] #ignore_list -- ['admin', ] #存放项目所有 url路由用的有序字典 url_ordered_dict = OrderedDict() md = import_string(settings.ROOT_URLCONF) urlpatterns = [] # urlpatterns = [ # url(r'^', include('web.urls')), # url(r'^rbac/', include('rbac.urls', namespace='rbac')), # ] print(md.urlpatterns) for item in md.urlpatterns: """ [ url(r'^', include('web.urls')),--RegexURLResolver url(r'^rbac/', include('rbac.urls',namespace='rbac')), -- RegexURLResolver url(r'^xx', auth.xx,name='xx') -- RegexURLPattern ] """ # [RegexURLResolver,RegexURLResolver,RegexURLPattern] if isinstance(item, RegexURLResolver) and item.namespace in ignore_list: continue urlpatterns.append(item) recursion_urls(None, "/", urlpatterns, url_ordered_dict) print('>>>>',url_ordered_dict) return url_ordered_dict 这是django1.11版本的写法,最近我换成了django2.2,发现用法不一样。
from django.conf import settings from django.utils.module_loading import import_string from django.urls import URLPattern, URLResolver # 路由分发:URLResolver 不是路由分发:URLPattern from collections import OrderedDict def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict): #None, "/", urlpatterns, url_ordered_dict # 递归第二层 #'rbac', "/", rbac.urls.urlpatterns, url_ordered_dict for item in urlpatterns: #w eb.urls.urlpatterns if isinstance(item, URLResolver): if pre_namespace: if item.namespace: namespace = "%s:%s" % (pre_namespace, item.namespace,) #'rbac':'rbac' else: namespace = pre_namespace # 'rbac' else: if item.namespace: #'rbac' namespace = item.namespace #'rbac' else: namespace = None # None, "/^", urlpatterns, url_ordered_dict recursion_urls(namespace, pre_url + item.pattern.regex.pattern, item.url_patterns, url_ordered_dict) #'/'+'^'--'/^', else: if pre_namespace: #None name = "%s:%s" % (pre_namespace, item.name,) else: name = item.name #name = 'login' if not item.name: raise Exception('URL路由中必须设置name属性') url = pre_url + item.pattern.regex.pattern #'^login/$'-- #/^^login/$ url_ordered_dict[name] = {'url_name': name, 'url': url.replace('^', '').replace('$', '')} # #url_ordered_dict['login'] = {'name': 'login', 'url': url.replace('^', '').replace('$', '')} #/login/ def get_all_url_dict(ignore_namespace_list=None): """ 获取路由中 :return: """ ignore_list = ignore_namespace_list or [] #ignore_list -- ['admin', ] #存放项目所有 url路由用的有序字典 url_ordered_dict = OrderedDict() md = import_string(settings.ROOT_URLCONF) urlpatterns = [] # urlpatterns = [ # url(r'^', include('web.urls')), # url(r'^rbac/', include('rbac.urls', namespace='rbac')), # ] print(md.urlpatterns) for item in md.urlpatterns: if isinstance(item, URLResolver) and item.namespace in ignore_list: continue urlpatterns.append(item) recursion_urls(None, "/", urlpatterns, url_ordered_dict) print('>>>>',url_ordered_dict) return url_ordered_dict 总体上变化不大,变成了
URLPattern, URLResolver
url = pre_url + item.pattern.regex.pattern # /^rbac/^user/edit/(?P<pk>\d_+)/$
recursion_urls(namespace, pre_url + item.pattern.regex.pattern, item.url_patterns, url_ordered_dict)
recursion_urls(None, '/', urlpatterns, url_ordered_dict) # 递归的去获取所有的路由。根目录没有namespace,根路由用/
这篇关于django路由分发1中RegexURLResolver, RegexURLPattern和2中URLResolver, URLPattern的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-012024年每个初学者都应该知道的Django十大技巧
- 2024-09-30云原生周刊:Argo CD v2.13 发布候选版本丨2024.9.30
- 2024-09-29哪个更快:OpenAI Whisper、Google TTS 还是 Piper TTS??
- 2024-09-29MLOps 端到端系统在 Google 云平台(I):赋能预测解决方案
- 2024-09-26通过 gcloud CLI 认证从本地脚本写入 Google Sheets
- 2024-09-24GoLand 新建项目 Enable vendoring support automatically 的作用是什么?-icode9专业技术文章分享
- 2024-09-21MongoDB资料:新手入门与初级应用指南
- 2024-09-20MongoDB教程:初学者必备指南
- 2024-09-05MongoDB入门:快速掌握NoSQL数据库基础
- 2024-08-28go 项目中怎么打印调试-icode9专业技术文章分享