Django框架路由分发-名称空间

一:路由分发

1.路由分发简介
1.django是专注于开发应用的,当一个django项目特别庞大的时候,所有的路由与视图函数映射关系全部写在项目名下urls.py(总路由层),很明显太冗余也不便于管理,这个时候也可以利用路由分发来减轻总路由的压力。

2.django的每一个应用(app)都可以有自己独立的urls.py路由器,static文件夹,templates文件夹。

3.基于上述特点,使用django做分组开发非常的简便。每个人只需要写自己的应用即可,互不干扰。最后由组长统一汇总到一个空的django项目中然后使用路由分发将多个应用关联在一起,即可完成大项目的拼接。

image

  • 路由分发解决的就是项目的总路由匹配关系过多的情况

  • 利用路由分发之后 总路由不再干路由与视图函数的直接对应关系

  • 总路由而是做一个分发处理(识别当前url是属于那个应用下的 直接分发对应的应用去处理)

  • 请求来了之后 总路由不做对应关系 只询问你要访问哪个app的功能 然后将请求转发给对应的app去处理

  • 提前创建好 应用app01 应用app02 然后记得注册

2.总路由分发配置
# 1.需要导入一个include路由分发模块
from django.conf.urls import url,include

# 2.导入子路由的uls(重名问题 起别名)
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 1.路由分发
    url(r'^app01/',include(app01_urls)),  # 只要url前缀是app01开头 全部交给app01处理
    url(r'^app02/',include(app02_urls))   # 只要url前缀是app02开头 全部交给app02处理
]
3.总路由终极配置(不需要导应用路由,直接点应用即可)
  • 不需要导应用路由,直接点应用即可
# 1.需要导入一个include路由分发模块
from django.conf.urls import url,include

# 总路由分发 简便(推荐)
urlpatterns = [
# 路由分发终极写法 简便
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),
]
4.子路由配置
# 子路由
	# app01 urls.py
  from django.conf.urls import url
  from app01 import views

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


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

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

image

二:名称空间

1.名称空间应用场景
当多个应用出现了相同的别名 我们研究反向解析会不会自动识别应用前缀
 
反向解析:正常情况下的反向解析是没有办法自动识别前缀的

2.解决 方式一>>>:名称空间

# 1.总路由增加一个名称空间
url(r'^app01/',include('app01.urls',namespace='app01')), # 创建名称空间app01
url(r'^app02/',include('app02.urls',namespace='app02'))  # 创建名称空间app02
# 2.子路由app01
urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
]
# 后端
def reg(request):
    print(reverse('app01:reg'))
    return HttpResponse('app01: reg')

# 前端
{% url 'app01:reg' %}
# 3.子路由app02
urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
]

# 后端
def reg(request):
    print(reverse('app02:reg'))
    return HttpResponse('app02: reg')
# 前端
{% url 'app02:reg' %}

image

3.解决方式二>>>:别名不能冲突(加上自己应用名作为前缀)
1.其实只要保证名字不冲突 就没有必要使用名称空间

2.解决方法
一般情况下 有多个app的时候我们在起别名的时候会加上app的前缀
这样的话就能够确保多个app之间名字不冲突的问题
# 1.子路由

# app01
urlpatterns = [
    url(r'^reg/',views.reg,name='app01_reg')
]

# app02
urlpatterns = [
    url(r'^reg/',views.reg,name='app02_reg')
]
posted @ 2022-02-28 15:59  AlexEvans  阅读(269)  评论(0编辑  收藏  举报