简介
路由简单的来说就是根据用户请求的 URL 链接来判断对应的处理程序,并返回处理结果,也就是 URL 与 Django 的视图建立映射关系。
Django 路由在 urls.py 配置,urls.py 中的每一条配置对应相应的处理方法。
Django 不同版本 urls.py 配置有点不一样:
1、Django1.1.x 版本
url() 方法:普通路径和正则路径均可使用,需要自己手动添加正则首位限制符号。
from django.conf.urls import url # 用 url 需要引入 urlpatterns = [ url(r"^admin/$", admin.site.urls), url(r"^index/$", views.index), # 普通路径 url(r"^articles/([0-9]{4})/$", views.articles), # 正则路径 ]
2、Django 2.2.x 之后的版本
path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已经添加。re_path:用于正则路径,需要自己手动添加正则首位限制符号。from django.urls import re_path # 用re_path 需要引入 urlpatterns = [ path("admin/", admin.site.urls), path("index/", views.index), # 普通路径 re_path(r"^articles/([0-9]{4})/$", views.articles), # 正则路径 ]
总结:Django1.1.x 版本中的 url 和 Django 2.2.x 版本中的 re_path 用法相同。
二、正则路径中的分组
1、正则路径中的无名分组
无名分组按位置传参,一一对应。
views 中除了 request,其他形参的数量要与 urls 中的分组数量一致。
urls.py
urlpatterns = [ path("admin/", admin.site.urls), re_path("^index/([0-9]{4})/$", views.index), ]
views.py
from django.shortcuts import HttpResponse def index(request,year): print(year) # 一个形参代表路径中一个分组的内容,按顺序匹配 return HttpResponse("菜鸟教程")
2、正则路径中的有名分组
语法:
(?P<组名>正则表达式)
有名分组按关键字传参,与位置顺序无关。
views 中除了 request,其他形参的数量要与 urls 中的分组数量一致, 并且 views 中的形参名称要与 urls 中的组名对应。
urls.py
urlpatterns = [ path("admin/", admin.site.urls), re_path("^index/(?P[0-9]{4})/(?P[0-9]{2})/$", views.index), ]
views.py
from django.shortcuts import HttpResponse def index(request, year, month): print(year,month) # 一个形参代表路径中一个分组的内容,按关键字对应匹配 return HttpResponse("菜鸟教程")
3、路由分发(include)
存在问题:Django 项目里多个app目录共用一个 urls 容易造成混淆,后期维护也不方便。
解决:使用路由分发(include),让每个app目录都单独拥有自己的 urls。
步骤:
1、在每个 app 目录里都创建一个 urls.py 文件。2、在项目名称目录下的 urls 文件里,统一将路径分发给各个 app 目录。from django.contrib import admin from django.urls import path,include # 从 django.urls 引入 include urlpatterns = [ path("admin/", admin.site.urls), path("app01/", include("app01.urls")), path("app02/", include("app02.urls")), ]
在各自 app 目录下,写自己的 urls.py 文件,进行路径跳转。
app01 目录:
from django.urls import path,re_path from app01 import views # 从自己的 app 目录引入 views urlpatterns = [ re_path(r"^login/(?P[0-9]{2})/$", views.index, ), ]
app02 目录:
from django.urls import path,re_path from app02 import views # 从自己的 app 目录引入views urlpatterns = [ re_path("^xxx/(?P[0-9]{4})/$", views.xxx), ]
在各自 app 目录下的 views.py 文件中写各自的视图函数。
三、反向解析
随着功能的增加,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护。
这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作。
反向解析一般用在模板中的超链接及视图中的重定向。
1、普通路径
在 urls.py 中给路由起别名,name="路由别名"。
path("login1/", views.login, name="login")
在 views.py 中,从 django.urls 中引入 reverse,利用reverse("路由别名")反向解析:
return redirect(reverse("login"))
在模板 templates 中的 HTML 文件中,利用{% url "路由别名" %}反向解析。
X 关闭
X 关闭