Django 跳转/重定向完全指南
在该教程中,我们将学习Django中一个重要的概念,即跳转。我们将了解Django跳转及其用途。我们还将看到跳转的示例,并讨论永久跳转和临时跳转。我们假设您已经熟悉Django的基本构建概念,如视图、模型和URL模式。如果您对Django不熟悉,请访问我们的 Django教程 。
什么是跳转
当我们使用Django框架创建一个Web应用程序时,我们会在某个点需要从一个URL跳转到另一个URL。我们可以通过在django的视图中返回 HttpResponseRedirect 或 HttpResponsePermanentRedirect 的实例来轻松地从当前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开发。