📜  httpresponseredirect 与重定向 (1)

📅  最后修改于: 2023-12-03 15:01:20.361000             🧑  作者: Mango

httpresponseredirect与重定向

介绍

HttpResponseRedirect 是 Django 允许的最简单的重定向方式。视图可以将其包装在 HttpResponse 对象中,并在其中提供重定向的 URL。当客户重定向到这个新的 URL 后,他们将与一个新的请求打交道,同时,一些数据将被巧妙地接收到这个新的请求中。用户将永久重定向到新的 URL 上。

重定向的使用场景

在 Django 中,我们常用的情况是当用户未经身份验证尝试访问需要身份验证的 URL 时,我们将它们自动重定向到登陆页面。我们也可以使用 HttpResponseRedirect 在视图中实现重定向,例如,当一个表单被成功提交时,我们希望用户被重定向到一个新的页面或一个一般性成功页面。

注意: Django 中的 HttpResponseRedirect 重定向是幂等的,因此它们会阻止重放攻击。也就是说,它们可以在 GET 请求中使用而无需担心重复提交。

重定向的代码实现
首先从 Django.http 模块中导入 HttpResponseRedirect。
from django.http import HttpResponseRedirect
在视图中使用 HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import render

def my_view(request):
    # 处理表单请求
    if request.method == 'POST':
        # 处理表单数据
        # ...
        # 处理成功后重定向到成功页面
        return HttpResponseRedirect(reverse('success'))

    # 渲染模板并返回HttpResponse
    return render(request, 'template.html')

在上述代码中,在处理表单请求时,如果表单数据处理成功,我们将使用 HttpResponseRedirect 重定向到成功页面。reverse 函数用于生成成功页面的 URL。对于重定向,我们不需要使用 render 函数,因为 HttpResponseRedirect 对象已经包含了需要在新请求中显示的所有数据。

永久重定向与临时重定向

通过 HttpResponseRedirect 我们可以实现两种类型的重定向:永久重定向和临时重定向。

永久重定向 (301)

如果您想重定向到的页面已经永久移动到了新的 URL,那么您可以使用 301 responded 代码。这将告诉浏览器客户端该页面永久重定向到新位置,并且不再使用旧位置。

永久重定向可以通过设置 HttpResponseRedirect 的 status 参数为 301 实现:

def my_view(request):
    ...
    return HttpResponseRedirect('/new-url/', status=301)
临时重定向 (302)

如果您只是想临时重定向到一个新的 URL,那么您应该使用 302 responded 代码。这将告诉浏览器客户端该页面已经被临时移动到新位置,但是仍然可以在旧位置获得。例如,在博客层面,如果您愿意在此刻将访问者转向到临时站点(如意义不大的站点),那么您可以使用 302 responded 代码。

临时重定向可以通过不显示 status 参数,或将其设置为 302 来实现:

def my_view(request):
    ...
    # 使用旧 URL 临时重定向到新 URL
    return HttpResponseRedirect('/new-url/')