在本教程中,我们将介绍 Django 的重要概念之一:重定向。我们将了解 Django 重定向及其用途。我们还将看到重定向的示例,并将讨论永久和临时重定向。我们假设您已经熟悉 Django 的基本构建概念,例如视图、模型和 URL 模式。

什么是重定向?

当我们使用 Django 框架创建 Web 应用程序时,我们有时会需要从一个 URL 访问另一个 URL。通过从 django 中的视图返回HttpResponseRedirectHttpResponseRedirect的实例,我们可以轻松地从当前 URL 跳转到另一个 URL 。我们需要使用view.py文件中的django.shortcuts模块导入重定向函数。让我们看下面的例子。

示例 - view.py

# views.py  
from django.shortcuts import redirect  
  
def redirect_view(request):  
    response = redirect('/redirect-success/')  
    return response  

在上面的view.py文件中,我们导入redirect()函数并在视图中使用URL进行调用。它将返回HttpResponseRedirect类,然后我们从视图中返回该类。

redirect_view必须包含在url.py文件中。

# urls.py  
from django.urls import path  
  
from .views import redirect_view  
  
urlpatterns = [  
    path('/redirect/', redirect_view)  
      
]  

假设这是我们 Django 项目的主 url.py 文件;URL /redirects/ 现在重定向 /redirect-success/。

还有另一种方法可以重定向 URL。我们可以使用带有视图名称或URL的redirect()函数来避免硬编码风格。

为什么重定向有用?

有人可能想知道为什么我们在重定向 URL 时要使用重定向。要了解重定向的意义所在,请阅读以下有关重定向的重要要点。

  • 当用户未登录并请求需要身份验证的 URL 将用户重定向到登录页面时,重定向非常有用。
  • 当用户成功登录时,Django 将用户重定向到原始请求。
  • 当用户更改密码时,我们可以重定向显示密码更改成功的页面。

当您在 Django 管理中创建对象时,Django 会将您重定向到对象列表。

除此之外,Django Redirects 在通过 Web 应用程序向用户提供方向方面发挥着重要作用。执行创建或删除对象等操作可能会给应用程序带来一些不便。使用重定向可以防止误操作两次。

表单处理重定向示例

在下面的示例中,当用户成功提交表单时,我们将在表单处理中使用redirect()函数。我们来理解下面的代码。

例子 -

from django import forms  
from django.http import HttpResponseRedirect  
from django.shortcuts import redirect, render  
  
class ContactForm(forms.Form):  
    name = forms.CharField()  
    email = forms.EmailField()  
    mobile = forms.CharField()  
    message = forms.CharField(widget=forms.Textarea)  
  
def contact_form_handle(request):  
    if request.method == 'GET':  
        form = ContactForm()  
    # The request method 'POST' indicates  
    # that the form was submitted  
    if request.method == 'POST':  # 1  
    # We are creating a form instanse to save the form data  
        form = ContactForm(request.POST)  # 2  
        # Validate the form  
        if form.is_valid():   
            # if the submitted data is valid  
            # the perform the following operations  
              
            name = form.cleaned_data['name'],  
            email = form.cleaned_data['email'],  
            mobile = form.cleaned_data['mobile'],  
            message =  form.cleaned_data['message']  
            form.save()  
            # When the operation is successful, it redirects to another web page.  
            return redirect('/success/')    
  
    return render(request, 'contact_form.html', {'form': form}) 

上面的代码将显示并处理联系表单。我们也可以将数据发送到模板文件。让我们详细了解一下代码。

  • 首先,我们导入了表单模块,并创建了一个包含一些字段的表单。
  • 然后,我们创建了处理表单的contant_handle_form()函数。
  • 该视图查看请求方法。当用户输入连接查看的URL时,浏览器执行GET操作。基本上 GET 请求将数据提供给用户。
  • 我们检查请求是否是POST,我们实例化一个ContactForm
  • 如果表单有效,我们使用 clean_data 清理输入数据
  • 保存数据后,视图返回重定向到 URL /success/。这是我们关心的步骤。
  • 在下一步中,我们传递 ContactForm 的实例并使用 django.shortcuts.render() 渲染html模板。
注意 - 在 Django 中,表单是在forms.py中创建的,但我们在 view.py 文件中创建表单来演示如何处理表单。

HTTP 重定向如何工作?

现在,问题是 HTTP 重定向是如何工作的。在本节中,我们将了解当用户在浏览器地址栏中输入 URL 时会发生什么。

假设我们创建了一个带有处理路径 /hello/ 的“HelloWorld”视图的 Django 应用程序。当我们在服务器上运行 Web 应用程序时,完整的 URL 将是 http://127.0.0.1:8000/hello/

URL中,127.0.0.1是IP地址,8000是端口。我们发送路径 /hello/ 的 GET 请求。服务器返回 HTTP 响应。

我们可以使用带有 -include 选项的curl 命令来查看客户端和服务器活动。

$ curl --include http://127.0.0.1:8000/hello/  

HTTP/1.1 200 OK  
Date: Sun, 09 Jul 2021 02:32:55 GMT  
Server: WSGIServer/0.2 CPython/3.6.3  
Content-Type: text/html; charset=utf-8  
X-Frame-Options: SAMEORIGIN  
Content-Length: 11  
  
Hello World  

在第一行中,HTTP 响应返回状态代码 200 和状态消息。状态行后面跟随任意数量的 HTTP 标头。

临时重定向与永久重定向

重定向有两种类型 - 临时和永久。状态码 301 表示永久重定向,302 表示已找到。发现表示临时重定向,这意味着“您当前正在查找的 URL 可以在另一个地址中找到”。相当于“本店已暂停营业,请前往其他店”。

永久重定向表示“您正在查找的 URL 在此地址不再可用。它在新地址上可用。” 永久 URL 使更改永久生效。

浏览器将 URL 响应保存在缓存中。下次用户输入相同的 URL 时,浏览器会记住重定向并将请求重定向到新地址。

永久和临时 URL 与搜索引擎优化相关。

重定向()函数

我们之前已经展示了redirect()函数的使用。我们可以使用get_absolute_url()方法、URL 或视图名称以及位置和/或关键字参数来调用此方法。

要创建永久 URL,我们需要传递参数permanent=True,它将返回HttpResponsePermanentRedirect的实例。

例子 -

from django.shortcuts import redirect  
  
def post_view(request):  
    return redirect('/home/42/')   

redirect ()函数会将任何字符串 a / 或 . 视为 URL 并将其用作重定向目标。

RedirectView 基于类的视图

假设我们有一个没有用但返回重定向的视图。在这种情况下,我们可以使用基于类的视图django.view.generic.base.RedirectView。

在以下示例中,字符串格式占位符与 URL 中的命名参数进行交换。

示例 - view.py

from django.views.generic.base import RedirectView  
  
class SearchRedirectView(RedirectView):  
  url = 'https://google.com/?q=%(term)s'  

示例 - urls.py

from django.urls import path  
from .views import SearchRedirectView  
  
urlpatterns = [  
    path('/search/<term>/', SearchRedirectView.as_view())  
]  

URL 使用 <term> 定义,这将有助于构建重定向。假设我们搜索Tom Hardy,路径将为 https://google.com/?q=TomHardy。我们将关键字参数url传递给urlpatterns中的as_view()

urls.py

from django.views.generic.base import RedirectView  
  
urlpatterns = [  
    path('/search/<term>/',  
         RedirectView.as_view(url='https://google.com/?q=%(term)s')),  
]  

我们可以通过重写 get_redirect_url() 方法来创建动态 URL。

视图.py

from random import choice  
from django.views.generic.base import RedirectView  
  
class RandomAnimalView(RedirectView):  
  
     actor_urls = ['/Chrisevance/', '/Tomhardy/', '/RobertAtinkson/']  
     is_permanent = True  
  
     def get_redirect_url(*args, **kwargs):  
        return choice(self.actor_urls)  

上面基于类的视图重定向到从 .actor_urls 中随机选取的 URL

结论

本教程包括有关使用 Django 进行 HTTP 重定向的指南。我们已经从 HTTP 协议的低级细节到高级细节探讨了重定向的每个重要概念。我们解释了永久和临时重定向、基于类的重定向。而且,关于重定向的知识不仅仅局限于Django框架;它可以用于任何语言的 Web 开发。

标签: django语言, django教程, django技术, django学习, django学习教程, django下载, django开发, django入门教程, django进阶教程, django高级教程, django面试题, django笔试题, django编程思想