路由重定向
重定向称为HTTP协议重定向,也可以称为网页跳转,它对HTTP状态码为301、302、303、307、308。简单来说,网页重定向就是在浏览器访问某个网页的时候,这个网页不提供响应内容,而是自动跳转到其他网址,由其他网址来生成响应内容。
Django的网页重定向有两种方式:第一种方式是路由重定向;第二种方式是自定义视图的重定向。 两种重定向方式各有优点,前者是使用Django内置的视图类RedirectView实现的,默认支持HTTP的GET请求;后者是在自定义视图的响应状态设置重定向,能让开发者实现多方面开发需求。
我们在MyDjango项目里分别讲述Django的两种重定向方式,在index的urls.py中定义trunTo,其代码如下所示:
from django.urls import path
from . import views
from django.views.generic import RedirectView
urlpatterns = [
# 添加带有字符类型、整型和slug的路由
path('<year>/<int:month>/<slug:day>', views.mydate, name='mydate'),
# 定义首页的路由
path('', views.index, name='index'),
# 设置路由跳转
path('trunTo', RedirectView.as_view(url='/'), name='trunTo'),
# path('trunTo', RedirectView.as_view(pattern_name='index:index'), name='trunTo'),
]
在路由里使用视图类RedirectView必须使用as_view方法将视图类实例化,参数url用于设置网页跳转的路由地址,"/"代表网站首页(路由命名为index的路由地址)。然后在index的views.py中定义视图函数mydate和index,代码如下:
from django.http import HttpResponse
from django.shortcuts import redirect
from django.shortcuts import reverse
def mydate(request, year, month, day):
return HttpResponse(str(year) + '/' + str(month) + '/' + str(day))
def index(request):
print(reverse('index:trunTo'))
return redirect(reverse('index:mydate', args=[2019,12,12]))
视图函数index使用重定向函数redirect实现网页重定向的,这是Django内置的重定向函数,其函数参数只需传入路由地址即可实现重定向。
运行MyDjango项目,在浏览器上输入127.0.0.1:8000/turnTo,发现该网址首先通过视图类RedirectView重定向首页(路由命名为index),然后在视图函数index里使用重定向函数redirect跳转到路由命名为mydate的路由地址,如图所示:
从图中看出,浏览器的开发者工具记录了3条西悉尼,其中trunTo的请求信息是我们在浏览器输入的网址,而名为127.0.0.1的请求信息是网站首页,两者的HTTP状态码都是302,说明视图类RedirectView和重定向函数redirect皆能实现网站的重定向。