一、前言
之前我们写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),
]
如图:
然后访问的时候:http:127.0.0.1/cmdb/login,就是 http:127.0.0.1/app名/login。如图:
三、默认值和命名空间
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
如图:
3.2、命名空间
如图:
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: 点击下载