一、前言

  之前我们写urls的时候,都是在project下的urls.py文件里面写我们需要跳转的url,但是你有没有想过,一个project下我们有很多app,那么每一个app开发的人员都不一样,如果频繁的去改project下的urls的话,那就会乱掉的,所以我们应该只需要在app里面修改就行了,没有必要全部在project里面修改。

二、路由的分发

2.1、路由分发

说明:在project下urls里面导入include包,然后只需要指向某个app就行了,然后具体app里面的,由他们自己设置

from django.contrib import admin
from django.urls import path,include  #导入include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('cmdb/',include("app01.urls"))   #指向app0里面urls.py
]

在app01的urls.py里面设置:

from django.urls import re_path,path
from app01 import views

urlpatterns = [
    re_path('^index/',views.index,name='index_qigao'),
    path('login/',views.login),  #FBV的写法
    re_path('^home/',views.Home.as_view()),  #CBV的写法
    path('detail/',views.detail),
]

如图:

day18-Django路由分发

然后访问的时候:http:127.0.0.1/cmdb/login,就是 http:127.0.0.1/app名/login。如图:

day18-Django路由分发

三、默认值和命名空间

3.1、添加默认值

说明:输入url时,传入默认值到后台

from django.urls import path,re_path
from app01 import views
urlpatterns = [
    re_path('^index/$', views.index,{"name":"shuaigaogao"}), #传入一个字典到后台
]

后台代码index的代码:

from django.shortcuts import render,HttpResponse

def index(request,name):  #这边需要传入一个参数,这个参数名是字典的key值,也就是{'name':'shuaigaogao'}中的name定义的
    print(name)
    return HttpResponse(name)

#输出
shuaigaogao

 如图:

 day18-Django路由分发

3.2、命名空间

如图:

day18-Django路由分发

a. project.urls.py

from django.conf.urls import url,include
 
urlpatterns = [
    url(r'^a/', include('app01.urls', namespace='author')),
    url(r'^b/', include('app01.urls', namespace='publisher')),
]

b. app01.urls.py

from django.conf.urls import url
from app01 import views
 
app_name = 'app01'
urlpatterns = [
    url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
]

c. app01.views.py

def detail(request, pk):
    print(request.resolver_match)
    return HttpResponse(pk)

 以上定义带命名空间的url之后,使用name生成URL时候,应该如下:

v = reverse('author:detail', kwargs={'pk':11})  #获取url
{% url 'author:detail' pk=12 pp=99 %}   #在前端模板的显示

django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

通过反射机制,为django开发一套动态的路由系统Demo: 点击下载

相关文章: