Python技术迷

Django教程-重定向

整理:python架构师

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

什么是重定向?

当我们使用 Django 框架创建 Web 应用程序时,我们有时会需要从一个 URL 访问另一个 URL。通过从 django 中的视图返回HttpResponseRedirect或HttpResponseRedirect的实例,我们可以轻松地从当前 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()函数来避免硬编码风格。

专属福利 

👉点击领取:最全Python资料合集

为什么重定向有用?

有人可能想知道为什么我们在重定向 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 开发。

Image
 1
Image
热门推荐

Image