Django URL路由分发系统
URL匹配过程
在Django中,我们使用urls.py模块处理url的分发
例:http://127.0.0.1:8080/abindex?a=1
1)去除域名和端口以及 /,剩下 abindex?a=1
2)拿 abindex?a=1 先到项目的 url.py 去匹配,然后拿剩下的index再到应用下面的urls.py去匹配
3)如果匹配成功,则调用相应的视图函数产生的内容返回给客户端。匹配失败的话则返回404错误。
from django.conf.urls import url #此处是项目下的urls.py from blog import views # url( path路径,views视图函数,反向解析) urlpatterns = [ url(r'admin/', admin.site.urls), #django后台admin url(r'^ab/', include('blog.urls')), #匹配到ab所指的blog应用下的urls.py再去匹配,此时用include函数指定位置 url(r'login1/',views.login,name='login')#若是从项目目录直接指向应用的views的话,在匹配 path路径 后,views视图函数直接写views.函数名 name= 为反向解析(例路径 login1所指向的反向解析为 login所对应的视图函数为views.login,所以,login1可以更换为其他地址,方便后期更改url,而不用重新更改视图函数和模版变量里的url) ]
一般来说,一个项目不止一个应用,所以,我们需要将分类,将不同的url分配到不同的应用中再做匹配,然后再执行views视图函数
from django.conf.urls import url #此处是项目下的urls.py from blog import views # url( path路径,views视图函数,反向解析) urlpatterns = [ url(r'admin/', admin.site.urls), #django后台admin url(r'^bss/', include('blog.urls')), #匹配到bss所指的bss应用下的urls.py再去匹配,此时用include函数指定位置 url(r'^web/', include('blog.urls')), #匹配到web所指的web应用下的urls.py再去匹配,此时用include函数指定位置 url(r'^vedio/', include('blog.urls')), #匹配到vedio所指的vedio应用下的vedio.py再去匹配,此时用include函数指定位置 ]
URL参数捕获
现在,我们通过include把项目中的url定位到我们应用来了,此时我们再从应用中匹配执行视图函数,并捕获url后面的参数
例:http://127.0.0.1:8080/bss/login/abc/2019
from django.conf.urls import url #此处是应用bss下的urls.py from django.urls import path,re_path from bss import views urlpatterns = [ path(r'^login/<str:name>/<int:num>',views.login), #此时先过项目的匹配,筛选掉了bss,然后剩余部分再匹配login ,剩下abc/2019,分别被name和num捕获到 re_path(r'login/(?P<name>\w+)/(?P<years>[0-9]{4})', views.test), # 通过函数re_path或者下面url函数 自定义固定参数捕获 name 和 num 参数 url(r'login/(?P<name>\w+)/(?P<years>[0-9]{4})', views.test), # 也可以通过函数url函数达到同样目的 ]
捕获到的name和num在views.py中应在函数定义的时候作为参数传入,且参数名必须保持一致
def login(request,name,num) pass
此时,url path re_path 三个函数可能会混淆
简单说 django 1.X 版本用url
django 2.X 版本用path re_path
可查看: https://www.bbsmax.com/A/D8546ZRQzE/ 做详细解说