Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第三章: django视图 > 3.5节: 重定向与反向解析

3.5节: 重定向与反向解析

薯条老师 2020-08-26 08:05:32 234576 2

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

3.5.1 理解重定向

所谓重定向,是指将客户端请求重新定位到其它位置。为什么需要重新定位呢?因为资源在服务器的路径发生了变动,如果继续使用之前的请求路径,会找不到该资源。

HTTP协议中的重定向是指URL的重定向,当请求的资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,需要通过重定向的技术来重新访问。

HTTP协议中的重定向类型主要分为临时重定向与永久重定向,各自对应不同的HTTP状态码。临时重定向,顾名思义,指的是站点资源临时地迁移到新url,下表为常用的临时重定向状态码:

临时重定向

描述

 

302

对于GET,HEAD等幂等请求,会根据服务端响应的Location字段中的url重新发起请求。对于POST请求,大部分浏览器会将请求方式改为GET。

307

对于GET,HEAD等幂等请求,会根据服务端响应的Location字段中的url重新发起请求。对于POST请求,会询问客户端是否对新url再次发起POST请求。

 永久重定向,顾名思义,指的是站点资源永久地迁移到新url,下表为永久重定向的状态码:

永久重定向

描述

 

301

对于GET,HEAD等幂等请求,会根据服务端响应的Location字段中的url重新发起请求。对于POST请求,部分浏览器会将请求方式改为GET。

3.5.2 django中的重定向类型

在django中使用HttpResponseRedirect进行临时重定向,使用HttpResponsePermanentRedirect来进行永久重定向,使用方法非常简单,只需传递新的url参数即可。url既可以硬编码的URL,也可以是完整的URL。

代码实例-使用HttpResponseRedirect进行临时重定向:

# 使用HttpResponseRedirect,需要从django.http模块中导出
from django.http import HttpResponseRedirect
"""
(1) 修改Html视图代码,临时重定向至/html5/
(2) 需要在urls.py再配置一个/html5/的路由
"""
class Html(View):
    def get(self, request):
        # 直接传递硬编码的url 
        return HttpResponseRedirect("/html5/")
 

# 新增的视图类Html5
class Html5(View):
    title = "根据客户端的查询请求来响应不同的html"
    """
    查询参数携带在url中,所以是对客户端的http get请求进行处理,对此不熟悉的读者,需要先学习下http协议
    """
    def get(self, request):
        """
        获取查询参数label,表示html标签,获取查询参数content,表示标签中的内容
        """
        label = request.GET.get('label', 'h1')
        content = request.GET.get('content', 'Hello Django')
        html = "<html><head><title>{0}</title></head><{1}>{2}</{1}></html>".
                                         format(self.title, label, content)
        # 响应html文本给浏览器
        return HttpResponse(html)

启动django服务器,在浏览器中访问http://127.0.0.1:8080/html/,可以发现地址迅速被修改成http://127.0.0.1:8080/html5/

 image.png

同时可以在命令行的输出中可以看到302的状态码:

[24/Aug/2020 16:21:33] "GET /html HTTP/1.1" 301 0

[24/Aug/2020 16:21:33] "GET /html/ HTTP/1.1" 302 0

[24/Aug/2020 16:21:33] "GET /html5/ HTTP/1.1" 200 114

代码实例-使用HttpResponsePermanentRedirect进行永久重定向:

# 使用HttpResponseRedirect,需要从django.http模块中导出
from django.http import HttpResponsePermanentRedirect
"""
(1) 修改Html视图代码,临时重定向至/html5/
(2) 需要在urls.py再配置一个/html5/的路由
"""
class Html(View):
    def get(self, request):
    # 直接传递完整的url
    return HttpResponsePermanentRedirect("http://127.0.0.1:8080/html5/")
 
 
# 新增的视图类Html5
class Html5(View):
    title = "根据客户端的查询请求来响应不同的html"
    """
    查询参数携带在url中,所以是对客户端的http get请求进行处理,对此不熟悉的读者,需要先学习下http协议
    """
    
    def get(self, request):
        """
        获取查询参数label,表示html标签,获取查询参数content,表示标签中的内容
        """
        label = request.GET.get('label', 'h1')
        content = request.GET.get('content', 'Hello Django')
        html = "<html><head><title>{0}</title></head><{1}>{2}</{1}></html>".
                                                format(self.title, label, content)
        # 响应html文本给浏览器
        return HttpResponse(html)

也可以直接使用Django中的快捷函数redirect来进行重定向,通过参数permanent来控制是否永久重定向。permanent参数默认为False,表示临时重定向,传递True时表示永久重定向。

代码实例-使用redirect进行重定向

from django.shortcuts import redirect
"""
(1) 修改Html视图代码,临时重定向至/html5/
(2) 需要在urls.py再配置一个/html5/的路由
"""

class Html(View):
    def get(self, request):
        # 直接传递需重定向的硬编码url 
        return redirect("/html5/")
 
 
# 新增的视图类Html5
class Html5(View):
    title = "根据客户端的查询请求来响应不同的html"
    
    """
    查询参数携带在url中,所以是对客户端的http get请求进行处理,对此不熟悉的读者,需要先学习下http协议
    """
    
    def get(self, request):
        """
        获取查询参数label,表示html标签,获取查询参数content,表示标签中的内容
        """
        label = request.GET.get('label', 'h1')
        content = request.GET.get('content', 'Hello Django')
        html = "<html><head><title>{0}</title></head><{1}>{2}</{1}></html>".
                                                   format(self.title, label, content)
        # 响应html文本给浏览器
        return HttpResponse(html)

3.5.3 reverse:反向解析

在定义URL与视图的路由时,可以通过path或re_path函数中的name参数为URL取一个别名。利用django内置的reverse函数可以将url反向解析为URL:

# 使用reverse,需要从django.shortcuts 模块中导出
from django.shortcuts import redirect,reverse
 
"""
(1) 在urls.py中将Html5视图的别名设置为html5
"""
 
class Html(View):
    def get(self, request):
        html5_url = reverse("html5")
        return redirect("/html5/")

通过reverse中的args参数或kwargs参数来传递参数给新的url。args以元组的形式传递参数,kwargs以字典的形式传递参数。

代码实例-使用reverse传递参数:

from django.shortcuts import redirect,reverse
"""
(1) 在urls.py中将Html5视图的别名设置为html5,同时在url中指定一个label的占位符
urls.py中的配置实例:
path('html5/<label>/', blog.html5,  name="html5"),
"""
 
class Html(View):
    def get(self, request):
        html5_url = reverse("html5",{"label": "article"})
        return redirect(html5_url)
 
 
class Html5(View):
    title = "根据客户端的查询请求来响应不同的html"
    
    """
    查询参数携带在url中,所以是对客户端的http get请求进行处理,对此不熟悉的读者,需要先学习下http协议
    """
    
    def get(self, request, label):
        """
        获取查询参数label,表示html标签,获取查询参数content,表示标签中的内容
        """
        content = request.GET.get('content', '使用reverse传递参数')
        html = "<html><head><title>{0}</title></head><{1}>{2}</{1}></html>".format(self.title, label, content)
        # 响应html文本给浏览器
        return HttpResponse(html)

3.5.4 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:



已有2位薯条发表了看法:

  • 访客

    访客  评论于 2020-09-29 23:52:23  回复

    如果用重定向的代码, 输入网址http://127.0.0.1:8080/html/ 重定向到http://127.0.0.1:8080/html5/,但是显示404页面不存在。需要手动加label参数如http://127.0.0.1:8080/html5/h1/ 才能正常显示。
    老师我想问的是为什么html5_url = reverse("html5",{"label": "article"}) 传的参数不能用

    • 薯条老师

      薯条老师  评论于 2020-10-07 09:44:13  回复

      需要在urls.py中配置路由,reverse中的参数,需要在url中指定一个占位符

欢迎 发表评论: