文章目录
- 前言
- 一、路由的使用
- 1.路由命名
- 2.路由分组
- 3.路由分发
- 二、反解析
前言
路由简单的来说就是根据用户请求的 URL 链接来判断对应的处理程序,并返回处理结果,也就是 URL 与 Django 的视图建立映射关系。
Django 2系列
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), # 正则路径
]
提示:以下是本篇文章正文内容,下面案例可供参考
一、路由的使用
1.路由命名
在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。
1.在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如
代码语言:javascript复制re_path(r'^',include('book.urls',namespace='book'))
命名空间表示,凡是book.urls中定义的路由,均属于namespace指明的book名下。
命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。
2.在定义普通路由时,可以使用name参数指明路由的名字,如
代码语言:javascript复制urlpatterns = [
re_path(r'^$',index),
# 匹配书籍列表信息的URL,调用对应的bookList视图
re_path(r'^booklist/$',bookList,name='index'),
re_path(r'^testproject/$',views.testproject,name='test'),
]
有参数无名路由
代码语言:javascript复制re_path(r"^login/([0-9]{2})/$", views.login, name="login")
代码语言:javascript复制return redirect(reverse("login",args=(10,)))
有参数有名路由
代码语言:javascript复制re_path(r"^login/(?P<year>[0-9]{4})/$", views.login, name="login")
代码语言:javascript复制return redirect(reverse("login",kwargs={"year":3333}))
3.在模板 templates 中的 HTML 文件中,利用 {% url “路由别名” %} 反向解析
无名反向解析
代码语言:javascript复制<form action="{% url 'login' %}" method="post">
有名反向解析
代码语言:javascript复制```javascript
<form action="{% url 'login' year=3333 %}" method="post">
2.路由分组
单个参数
代码语言:javascript复制urlpatterns = [
path('admin/', admin.site.urls),
re_path("^index/([0-9]{4})/$", views.index),
]
代码语言:javascript复制from django.shortcuts import HttpResponse
def index(request,year):
print(year) # 一个形参代表路径中一个分组的内容,按顺序匹配
return HttpResponse()
多个参数
代码语言:javascript复制from django.shortcuts import HttpResponse
def index(request,year):
print(year) # 一个形参代表路径中一个分组的内容,按顺序匹配
return HttpResponse()
代码语言:javascript复制from django.shortcuts import HttpResponse
def index(request, year, month):
print(year,month) # 一个形参代表路径中一个分组的内容,按关键字对应匹配
return HttpResponse()
3.路由分发
路由分发(include)
存在问题:Django 项目里多个app目录共用一个 urls 容易造成混淆,后期维护也不方便。
解决:使用路由分发(include),让每个app目录都单独拥有自己的 urls。
app 总目录下
代码语言:javascript复制from django.contrib import admin
from django.urls import path,include # 从 django.urls 引入 include
urlpatterns = [
path('admin/', admin.site.urls),
path("index/", include("index.urls")),
path("login/", include("login.urls")),
]
index 目录:
代码语言:javascript复制from django.urls import path,re_path
from index import views # 从自己的 app 目录引入 views
urlpatterns = [
re_path(r'^login/(?P<m>[0-9]{2})/$', views.index, ),
]
login 目录:
代码语言:javascript复制from django.urls import path,re_path
from login import views # 从自己的 app 目录引入views
urlpatterns = [
re_path("^xxx/(?P[0-9]{4})/$", views.xxx),
]
二、反解析
随着功能的增加,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护。
这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作。
反向解析一般用在模板中的超链接及视图中的重定向。
使用reverse函数,可以根据路由名称,返回具体的路径,如:
代码语言:javascript复制from django.core.urlresolvers import reverse
#或者
from django.urls import reverse
def testproject(request):
return HttpResponse("OK")
# 定义视图:提供书籍列表信息
def bookList(request):
url = reverse('book:test')
print(url)
return HttpResponse('index')
- 对于未指明namespace的,reverse(路由name)
- 对于指明namespace的,reverse(命名空间namespace:路由name)