概述

核心是一个基类 HttpResponseRedirectBase,以及两个具体的子类 HttpResponseRedirect(302 临时重定向)和 HttpResponsePermanentRedirect(301 永久重定向)。它们都是 HttpResponse 的子类,专门用于告诉客户端(通常是浏览器)跳转到另一个URL。


class HttpResponseRedirectBase(HttpResponse):allowed_schemes = ['http', 'https', 'ftp']def __init__(self, redirect_to, *args, **kwargs):super().__init__(*args, **kwargs)self['Location'] = iri_to_uri(redirect_to)parsed = urlparse(str(redirect_to))if parsed.scheme and parsed.scheme not in self.allowed_schemes:raise DisallowedRedirect("Unsafe redirect to URL with protocol '%s'" % parsed.scheme)url = property(lambda self: self['Location'])def __repr__(self):return '<%(cls)s status_code=%(status_code)d%(content_type)s, url="%(url)s">' % {'cls': self.__class__.__name__,'status_code': self.status_code,'content_type': self._content_type_for_repr,'url': self.url,}class HttpResponseRedirect(HttpResponseRedirectBase):status_code = 302class HttpResponsePermanentRedirect(HttpResponseRedirectBase):status_code = 301

逐行解析

1. 基类:HttpResponseRedirectBase
class HttpResponseRedirectBase(HttpResponse):allowed_schemes = ['http', 'https', 'ftp']
  • 继承:它继承自 HttpResponse,这意味着它拥有所有普通HTTP响应的特性(如状态码、头部、内容等),并在此基础上增加了重定向的特殊功能。
  • 类属性 allowed_schemes:这是一个非常重要的安全特性。它定义了一个白名单,列出了允许重定向到的URL协议(scheme)。默认只允许 'http', 'https', 'ftp'。这可以防止一种称为不安全的URL重定向的安全漏洞,例如,如果有人试图构造一个 javascript:alert('xss')data:text/html;base64,... 这样的恶意链接,由于其协议(javascript:, data:)不在白名单内,重定向将会被阻止并抛出异常。
    def __init__(self, redirect_to, *args, **kwargs):super().__init__(*args, **kwargs)
  • 构造函数:接受一个必需的参数 redirect_to(要重定向到的目标URL),以及其他任何父类 HttpResponse 可能接受的参数(如 content, content_type 等)。
  • 调用父类构造函数super().__init__(*args, **kwargs) 确保 HttpResponse 被正确初始化。
        self['Location'] = iri_to_uri(redirect_to)
  • 设置Location头部:这是实现重定向的关键。HTTP协议规定,重定向响应必须在 Location 头部中包含目标URL。这里通过将字典式的赋值(self['Location'])来设置响应头。
  • iri_to_uri函数:这是一个Django的工具函数,用于将国际化资源标识符(IRI) 转换为标准的统一资源标识符(URI)。IRI支持Unicode字符(如中文),而URI只允许使用ASCII字符。这个函数会正确处理非ASCII字符的编码(例如,将“中文”转换为%E4%B8%AD%E6%96%87)。
        parsed = urlparse(str(redirect_to))if parsed.scheme and parsed.scheme not in self.allowed_schemes:raise DisallowedRedirect("Unsafe redirect to URL with protocol '%s'" % parsed.scheme)
  • 安全验证
    1. urlparse(str(redirect_to)):使用Python的 urllib.parse.urlparse 函数解析目标URL,将其拆分成各个组成部分(scheme, netloc, path等)。
    2. 检查解析出的协议(parsed.scheme)是否存在且不在允许的协议白名单(self.allowed_schemes)中。
    3. 如果协议不被允许,则抛出一个 DisallowedRedirect 异常,中止重定向过程。这是防止安全漏洞的关键防线。
    url = property(lambda self: self['Location'])
  • 只读属性 url:使用 property 装饰器创建了一个名为 url 的只读属性。当你访问 response.url 时,它会返回 Location 头部的值,即重定向的目标URL。这提供了一个非常方便和直观的访问方式。
    def __repr__(self):return '<%(cls)s status_code=%(status_code)d%(content_type)s, url="%(url)s">' % {'cls': self.__class__.__name__,'status_code': self.status_code,'content_type': self._content_type_for_repr,'url': self.url,}
  • 对象表示:定义了 __repr__ 方法,当你在Python shell中打印这个响应对象时,它会返回一个格式化的、信息丰富的字符串,而不是默认的晦涩的内存地址。例如:<HttpResponseRedirect status_code=302, url="https://example.com/">。这在调试时非常有用。

2. 具体实现类:HttpResponseRedirectHttpResponsePermanentRedirect

这两个类非常简单,它们只做了一件事:继承基类并设置正确的HTTP状态码。

class HttpResponseRedirect(HttpResponseRedirectBase):status_code = 302
  • 302 临时重定向:HTTP状态码302表示所请求的资源暂时位于另一个URI下。客户端(如浏览器或搜索引擎爬虫)在遇到此重定向时,应该继续使用原始URL发起请求,因为这次重定向可能是临时的。
class HttpResponsePermanentRedirect(HttpResponseRedirectBase):status_code = 301
  • 301 永久重定向:HTTP状态码301表示所请求的资源已永久移动到新的URI。客户端(尤其是搜索引擎爬虫)在遇到此重定向后,应该更新其书签或索引,将来所有的请求都应直接发送到新的URL。这对SEO有重要意义。

总结与使用场景

特性HttpResponseRedirect (302)HttpResponsePermanentRedirect (301)
状态码302301
语义临时移动永久移动
浏览器行为会继续使用原URL发起请求可能会缓存重定向,后续直接请求新URL
SEO影响原URL的权重和排名通常不会传递到新URL原URL的权重和排名会传递到新URL
常见使用场景用户登录后跳转、表单提交后跳转(Post/Redirect/Get模式)网站改版更换URL结构、HTTP升级到HTTPS

在实际视图中的用法

在Django视图中,你通常不会直接实例化这些类,而是使用更简短的快捷函数 redirect(),它内部就是创建这些类的实例。

等效的写法:

from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect
from django.shortcuts import redirect# 方法一:直接使用类(显式,稍显冗长)
def my_view(request):return HttpResponseRedirect('/some/url/')# 或者 return HttpResponsePermanentRedirect('/some/url/')# 方法二:使用redirect()快捷函数(推荐,更灵活)
def my_view(request):# redirect() 函数默认返回 302 重定向return redirect('/some/url/') # 可以传递一个模型对象,它会自动调用 get_absolute_url()# return redirect(some_model_object) # 可以传递一个视图名和参数# return redirect('view-name', arg=arg) # 要返回 301 重定向,使用 permanent 参数return redirect('/some/url/', permanent=True)

总之,这段代码展示了Django如何通过面向对象的继承和组合,构建出一个既安全(通过协议白名单和IRI转换)又灵活(通过基类和不同状态码的子类)的重定向响应体系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98011.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98011.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98011.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java实战⑳】从IO到NIO:Java高并发编程的飞跃

目录一、NIO 与 IO 的深度剖析1.1 IO 的局限性1.2 NIO 核心特性1.3 NIO 核心组件1.4 NIO 适用场景二、NIO 核心组件实战2.1 Buffer 缓冲区2.2 Channel 通道2.3 Selector 选择器2.4 NIO 文件操作案例三、NIO2.0 实战3.1 Path 类3.2 Files 类3.3 Files 类高级操作3.4 NIO2.0 实战…

OpenCV 实战:图像模板匹配与旋转处理实现教程

目录 一、功能概述&#xff1a;代码能做什么&#xff1f; 二、环境准备&#xff1a;先搭好运行基础 1. 安装 Python 2. 安装 OpenCV 库 3. 准备图像文件 三、代码逐段解析&#xff1a;从基础到核心 1. 导入 OpenCV 库 2. 读取图像文件 3. 模板图像旋转&#xff1a;处理…

一、cadence的安装及入门教学(反相器的设计与仿真)

一、Cadence的安装 1、安装VMware虚拟机 2、安装带有cadence软件的Linux系统 注&#xff1a;网盘链接 分享链接&#xff1a;https://disk.ningsuan.com.cn/#s/8XaVdtRQ 访问密码&#xff1a;11111 所有文件压缩包及文档密码&#xff1a; Cadence_ic 3、安装tsmc18工艺库…

用ai写了个UE5插件

文章目录实际需求1.头文件2.源文件3.用法小结实际需求 这个需求来源于之前的一个项目&#xff0c;当时用了一个第三方插件&#xff0c;里边有一些绘制线段的代码&#xff0c;c层用的是drawdebugline&#xff0c;当时看底层&#xff0c;觉得应该没问题&#xff0c;不应该在rele…

机器学习从入门到精通 - 强化学习初探:Q-Learning到Deep Q-Network实战

机器学习从入门到精通 - 强化学习初探&#xff1a;从 Q-Learning 到 Deep Q-Network 实战 一、开场白&#xff1a;推开强化学习这扇门 不知道你有没有过这种感觉 —— 盯着一个复杂的系统&#xff0c;既想让它达到某个目标&#xff0c;又苦于无法用传统规则去精确描述每一步该怎…

【OpenHarmony文件管理子系统】文件访问接口解析

OpenHarmony文件访问接口&#xff08;filemanagement_file_api&#xff09; 概述 OpenHarmony文件访问接口&#xff08;filemanagement_file_api&#xff09;是开源鸿蒙操作系统中的核心文件系统接口&#xff0c;为应用程序提供了完整的文件IO操作能力。该项目基于Node-API&…

云手机运行是否消耗自身流量?

云手机运行是否消耗自身流量&#xff0c;取决于具体的使用场景和设置&#xff1a;若用户在连接云手机时&#xff0c;使用的是家中Wi-Fi、办公室局域网等非移动数据网络&#xff0c;那么在云手机运行过程中&#xff0c;基本不会消耗用户自身的移动数据流量&#xff0c;在家中连接…

JavaSe之多线程

一、多线程基本了解 1、多线程基本知识 1.进程:进入到内存中执行的应用程序 2.线程:内存和CPU之间开通的通道->进程中的一个执行单元 3.线程作用:负责当前进程中程序的运行.一个进程中至少有一个线程,一个进程还可以有多个线程,这样的应用程序就称之为多线程程序 4.简单理解…

产品月报|睿本云8月产品功能迭代

睿本云8月更新已陆续上线&#xff01; 睿本云8月产品月报&#xff0c;点击查收&#x1f447;小程序支付成功弹窗广告、企业会员增加卡券销售和卡券退货模块、工厂端可批量新增多门店订货单、门店端和工厂端新增“极速订货”、商品调拨业务支持自定义多种流程配置等功能迭代更新…

融云:当我们谈论 AI 重构业务时,我们到底在谈论什么

所有业务都值得用 AI 重新做一次。 这句话正在从一句鼓舞人心的口号&#xff0c;演变为一场无人可避的商业现实。AI 带来的结构性机会&#xff0c;意味着企业有机会从根本上重构成本、效率与体验的曲线。但这一切最终都要回到一个无比务实的问题上&#xff1a; AI 究竟如何在我…

org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1异常

org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length 1异常问题解决一、问题背景二、错误现象三、原因分析核心问题&#xff1a;字符集不匹配四、解决过程试错路径记录五、最终方案1.创建launch.json文件&#xff0c;修改VSCode…

【C语言】深入理解指针(5)

目录 sizeof和strlen 1.sizeof 2.strlen 3. sizeof 和 strlen 的对比 sizeof和strlen 1.sizeof sizeo正名&#xff1a;sizeof是操作符&#xff0c;不是函数&#xff0c;sizeof是操作符&#xff0c;括号内如果有计算不会进行计算sizeof 是操作符&#xff0c;用于计算变量所…

动态代理设计模式

JDK动态代理实现 动态代理利用了JDK API,动态地在内存中构建代理对象,从而实现对目标对象的代理功能.动态代理又被称为JDK代理或接口代理. 静态代理与动态代理的区别: 静态代理在编译时就已经实现了,编译完成后代理类是一个实际的class文 动态代理是在运行时动态生成的,即编译…

《Html泛型魔法学院:用霍格沃茨风格网页教授集合框架》

一、项目概述 这个创意教学网页&#xff0c;将Java泛型与集合框架知识融入霍格沃茨魔法世界主题。通过沉浸式UI设计和交互式代码练习&#xff0c;让抽象的技术概念变得生动有趣。主要技术栈包括&#xff1a; HTML5语义化结构Tailwind CSS框架Font Awesome图标库纯JavaScript交…

学习PaddlePaddle--环境配置-PyCharm + Conda​

第一阶段&#xff1a;安装与配置 Python 和 Conda​​ 虽然 PyCharm 可以管理环境&#xff0c;但我们先独立准备好 Conda 环境&#xff0c;这样更清晰可靠。 ​​1. 安装 Miniconda (Python 环境管理)​​ 1. ​​下载​​&#xff1a; • 访问 Miniconda 官网。 • 选择 ​​M…

【数据库】Sql Server数据库中isnull、iif、case when三种方式的使用和空值判断

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录前言ISNULL用法c…

【蓝桥杯选拔赛真题64】C++最大空白区 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解

C++最大空白区 第十四届蓝桥杯青少年创意编程大赛C++选拔赛真题 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】 1、C++专栏 电子学会C++一级历年真题解析 电子学会C++二级历年真题解析

试用Augment编写python脚本实现智能家居3D环境交互响应

环境配置 VS Code中直接安装Augment扩展&#xff0c;然后邮箱登录就能获得7天的试用。 从如下位置安装3D建模软件Blender&#xff1a; https://www.blendercn.org/downloadme#xiazai Blender 是一款免费开源的 3D 创作套件。它支持整个三维流程&#xff1a;建模、绑定、动画…

【架构师干货】系统架构设计

1. 软件架构概述 从需求分析到软件设计之间的过渡过程称为软件架构。只要软件架构设计好了&#xff0c;整个软件就不会出现坍塌性的错误&#xff0c;即不会崩溃。 架构设计就是需求分配&#xff0c;将满足需求的职责分配到组件上。 软件架构为软件系统提供了一个结构、行为和属…

Java设计模式之结构型—享元模式

Java中最常用的设计模式-CSDN博客 把“不可变且可复用”的细粒度对象缓存起来&#xff0c;用“共享”代替“新建”&#xff0c;从而节省内存。 经典场景 字符串常量池、Integer.valueOf(-128~127)、Android Message.obtain() 游戏粒子、编辑器字形、地图瓦片、线程池中的任务…