Django 跳转/重定向完全指南

Django 跳转/重定向完全指南

在该教程中,我们将学习Django中一个重要的概念,即跳转。我们将了解Django跳转及其用途。我们还将看到跳转的示例,并讨论永久跳转和临时跳转。我们假设您已经熟悉Django的基本构建概念,如视图、模型和URL模式。如果您对Django不熟悉,请访问我们的 Django教程 。

什么是跳转

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

示例- view.py

# views.py
from django.shortcuts import redirect

def redirect_view(request):
    response = redirect('/redirect-success/')
    return response

在上述的 view.py文件 中,我们导入了redirect()函数,并在视图中调用一个URL。它将返回 # 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的方法。我们可以使用 redirect() 函数来避免硬编码样式,只需提供视图或URL的名称。

为什么重定向很有用

有人可能会想为什么我们重定向URL时要使用重定向。为了了解重定向何时有意义,请阅读以下关于重定向的重要观点:

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

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

除此之外,Django重定向在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的表单。
  • 如果表单有效,我们使用cleaned_data来清理输入的数据。

  • 保存数据后,视图函数将重定向到URL/success/。这是我们关心的一步。

  • 在下一步中,我们将传递ContactForm的实例,并使用django.shortcuts.render()渲染html模板。

注意 – 在Django中,表单是在forms.py中创建的,但我们在view.py文件中创建表单,以演示如何处理表单。

HTTP重定向的工作原理

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

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

在该URL中,127.0.0.1是IP地址,8000是一个端口。我们发送GET请求以获取路径/hello/。服务器返回HTTP响应。

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

$ 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头。

临时重定向 vs. 永久重定向

有两种类型的重定向 – 临时和永久。状态码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 /或.as作为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//', SearchRedirectView.as_view())
]

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

urls.py

from django.views.generic.base import RedirectView

urlpatterns = [
    path('/search//',
         RedirectView.as_view(url='https://google.com/?q=%(term)s')),
]

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

view.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开发。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程