Django路由分发与名称空间的概念

路由分发

django每一个应用都可以拥有自己的templates文件夹 urls.py static文件夹
基于这个特点:django能够非常好的做到分组开发(每个人只写自己的app)

作为组长:只需要将手下书写的app全部拷贝到一个新的django项目中,然后再配置文件里面注册所有的app再利用路由分发的特点将所有的app整合起来

当一个django项目中的url特别多的时候,总路由urls.py代码非常冗余不好维护
这个时候也可以利用路由分发来减轻总路由的压力

具体使用

引子:

利用路由分发之后,总路由不再做路由与视图函数的直接对应关系,而是做一个分发处理
识别当前url是属于那个应用下的,直接分发给对应的应用去处理。
#  在创建应用时:需要自己手动给应用创建urls.py文件

总路由:

from django.conf.urls import url,include
from django.contrib import admin
from app01 import urls as app01_urls   # 再导入应用的urls模块时因为名字相同产生冲突可使用as语法起别名
from app02 import urls as app02_urls

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    # 路由分发方式一(必须导入子路由):
    url(r'^app01/',include(app01_urls)),  # url前缀是app01打头 全部交给app01处理
    url(r'^app02/',include(app02_urls)),  # url前缀是app02打头 全部交给app02处理

    # 终极写法(无需导入模块):
    url(r'^app01/',include('app01.urls')),  # 注:这里的正则千万不能加$符号,如果加了到'/'就结束了 不会再去子路由里面找后缀路由进行匹配。
    url(r'^app02/',include('app02.urls'))
]
# 终极写法无需导入子路由过来,也无需给子路由起别名,减少代码编写提升效率。

子路由app01:

from django.conf.urls import url
from app01 import views


urlpatterns = [
    url(r'^reg/',views.reg)
]

# views.py
def reg(request):
    return HttpResponse('app01 reg')

子路由app02:

from django.conf.urls import url
from app02 import views


urlpatterns = [
    url(r'^reg/',views.reg)
]ss

# views.py
def reg(request):
    return HttpResponse('app02 reg')
# 这就相当于:识别到路由是app01/前缀时,就会去子路由app01里找app01自己的urls.py(app01_urls),然后会根据子路由与视图函数的直接对应关系进行匹配

名称空间

引子:

# 研究:当多个应用反向解析时出现了相同的路由别名 我们研究反向解析会不会自动识别对应的应用前缀
# 总路由 urls.py
    url(r'^app01/',include('app01.urls',)),
    url(r'^app02/',include('app02.urls'))

# app01 urls.py
from app01 import views
urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
]

# app02 urls.py
from app02 import views
urlpatterns = [
    url(r'reg/',views.reg,name='reg')   # 使用相同的别名
]

# app01 views.py
def reg(request):
    print(reverse('reg'))
    return HttpResponse('reg app01')

# app02 views.py
def reg(request):
    print(reverse('reg'))
    return HttpResponse('reg app02')

# 我们可以看到:正常情况下的反向解析是没有办法自动识别前缀的

使用名称空间解决:

# 总路由
    url(r'^app01/',include('app01.urls',namespace='app01')),
    url(r'^app02/',include('app02.urls',namespace='app02'))
# 解析的时候
  	# app01 urls.py 
  	urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
		]
    # app02 urls.py
    urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
		]
# 后端解析
  	reverse('app01:reg')
    reverse('app02:reg')

# 前端解析:   
{% url 'app01:reg' %}
{% url 'app02:reg' %}

补充:

# 其实只要保证名字不冲突 就没有必要使用名称空间
"""
一般情况下 有多个app的时候我们在起别名的时候会加上app的前缀
这样的话就能够确保多个app之间名字不冲突的问题
"""
urlpatterns = [
    url(r'^reg/',views.reg,name='app01_reg')
]
urlpatterns = [
    url(r'^reg/',views.reg,name='app02_reg')
]
posted @ 2022-03-01 15:18  JasonBorn  阅读(47)  评论(0编辑  收藏  举报