路由分发
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')
]