Django URL路由分发系统

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函数达到同样目的
   url(r'login/(\w+)/(\d+)', 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/  做详细解说

猜你喜欢

转载自www.cnblogs.com/zc3614/p/11682127.html