DRF 跨域问题

【一】说明

  • CORS(跨来源资源共享,Cross-Origin Resource Sharing)是一种浏览器技术的规范,旨在解决浏览器同源策略(Same-Origin Policy)的限制,使得Web服务可以从不同的网域(源)安全地加载资源。

(1)浏览器同源策略

  • 同源策略是浏览器的一种安全机制,用于限制在浏览器中加载的文档或脚本如何与不同源(协议、域名和端口)的资源进行交互。具体来说,当一个页面加载了来自特定源的资源后,该页面只能与同源的资源进行交互,而无法直接访问其他源的资源。
    • 地址:指的是域名或IP地址。
    • 端口:HTTP默认端口是80,HTTPS默认端口是443。如果端口不同,即使域名和协议相同,也视为不同源。
    • 协议:HTTP和HTTPS是两种不同的协议,即使域名和端口相同,协议不同也视为不同源。

(2)CORS 跨域资源共享

  • CORS是一种机制,允许服务器在响应中设置一些特殊的HTTP头部,以授权其他域名下的页面访问自己的资源。这样,就可以绕过浏览器的同源策略限制,实现跨域资源共享。
  • CORS需要浏览器和服务器同时支持。对于浏览器来说,只要支持CORS的浏览器(如现代浏览器都支持,IE浏览器不能低于IE10),在发现AJAX请求跨源时,会自动添加一些附加的头信息(如Origin字段),有时还会多出一次附加的请求(预检请求,Preflight Request),但用户不会有感觉。
  • 对于服务器来说,只要服务器实现了CORS接口(即在响应中设置了正确的CORS头部),就可以允许跨源通信。具体来说,服务器会在响应头部中添加一些CORS相关的字段,如Access-Control-Allow-Origin,来指定哪些源可以访问该资源。

(3)CORS请求的分类

  • 浏览器将CORS请求分成两类:简单请求(Simple Request)和非简单请求(Not-So-Simple Request)。
    • 简单请求:只要同时满足以下两大条件,就属于简单请求:
      • 请求方法是HEAD、GET、POST三者之一
      • HTTP的头信息不超出Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type(只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)这几种字段。
    • 非简单请求:不同时满足简单请求条件的请求都属于非简单请求。对于非简单请求,浏览器会先发出一个预检请求(Preflight Request),询问服务器是否允许该跨域请求。如果服务器在预检请求的响应中同意了该请求,浏览器才会发出实际的CORS请求。

【二】方法一:自定义

(1)自定义中间件

from django.utils.deprecation import MiddlewareMixin
class CorsMiddleWare(MiddlewareMixin):def process_response(self,request,response):# options请求就是非简单请求的预检请求if request.method=="OPTIONS":response["Access-Control-Allow-Headers"]='Content-Type, *'  # 注意:通常不建议使用 '*',应该明确列出允许的头response['Access-Control-Allow-Methods'] = 'GET, POST, PUT, PATCH, DELETE, OPTIONS'response['Access-Control-Max-Age'] = 86400  # 预检请求的缓存时间(秒)response["Access-Control-Allow-Origin"] = "*" # 注意:'*' 允许所有来源,但出于安全考虑,建议使用具体的来源  return response
  • 注意
    • 在生产环境中,通常不建议将 Access-Control-Allow-Origin 设置为 *,因为这可能会降低安全性。您应该将其设置为特定的源,如 'https://example.com'
    • Access-Control-Allow-Headers 也不应设置为 *,除非您确实希望允许所有头。通常,您应该明确列出您希望允许的头,如 'Content-Type, X-Requested-With'

(2)添加到配置文件

MIDDLEWARE = [# ... 其他中间件 ...  '自定义中间位置.CorsMiddleWare',# ... 其他中间件 ...  
]

【三】方法二:第三方

(1)使用pip安装

pip install django-cors-headers

(2)注册app

  • 在Django项目的 settings.py 文件中,将 'corsheaders' 添加到 INSTALLED_APPS 列表中。
INSTALLED_APPS = (  ...  'corsheaders',  ...  
)

(3)添加到中间件

  • settings.py 文件的 MIDDLEWARE 列表中,确保 'corsheaders.middleware.CorsMiddleware' 出现在其他中间件之前,但位于 'django.middleware.security.SecurityMiddleware' 之后(如果你使用了它)。
MIDDLEWARE = [  ...  'django.middleware.security.SecurityMiddleware',  'corsheaders.middleware.CorsMiddleware',  ...  
]

(4)配置CORS设置

  • settings.py 文件中,配置CORS相关的设置。
CORS_ORIGIN_ALLOW_ALL = True  # 如果设置为True,则允许所有源进行跨域访问  
CORS_ALLOW_METHODS = (  'DELETE',  'GET',  'OPTIONS',  'PATCH',  'POST',  'PUT',  
)  
CORS_ALLOW_HEADERS = (  'accept-encoding',  'authorization',  'content-type',  'dnt',  'origin',  'user-agent',  'x-csrftoken',  'x-requested-with',  
)  # 如果希望允许携带凭证(如cookies、HTTP认证及客户端SSL证明等)的跨域请求  
# 需要设置以下两个配置,并且CORS_ORIGIN_ALLOW_ALL 必须为False,同时指定具体的源  
# CORS_ALLOW_CREDENTIALS = True  
# CORS_ORIGIN_WHITELIST = (  
#    'http://example1.com',  
#    'http://example2.com',  
#    ...  
# )

(5)源码简单分析

image-20240515093139158

  • 检查是否允许所有源
    • 如果 CORS_ORIGIN_ALLOW_ALL 设置为 True 并且 CORS_ALLOW_CREDENTIALS 没有设置为 True(因为携带凭证的请求不允许使用 * 作为 Access-Control-Allow-Origin 的值),则中间件会将 Access-Control-Allow-Origin 设置为 *
  • 处理OPTIONS请求
    • 当接收到 OPTIONS 请求时(即预检请求),中间件会根据 CORS_ALLOW_METHODSCORS_ALLOW_HEADERS 的设置来设置相应的响应头 Access-Control-Allow-MethodsAccess-Control-Allow-Headers
  • 可以发现自定义中间件就是简化的这部分代码

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

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

相关文章

计算机视觉与机器学习之文档解析与向量化技术加速多模态大模型训练与应用

目录 前言1、TextIn文档解析技术1.1、文档解析技术1.2、目前存在的问题1.2.1、不规则的文档信息示例 1.3、合合信息的文档解析1.3.1、合合信息的TextIn文档解析技术架构1.3.2、版面分析关键技术 Layout-engine1.3.3、文档树提取关键技术 Catalog-engine1.3.4、双栏1.3.5、非对称…

活字格如何复制指定单元格中的内容

1、安装插件“复制到剪贴板”后。 2、在需要执行复制的命令中,选择“复制到剪贴板” 3、选择源单元格。 4、执行看效果。

在线扭蛋机小程序:商家稳占市场的新突破口

近几年,扭蛋机进入了爆发期,动漫、游戏的发展更是推动了市场的发展,我国扭蛋机正在蓬勃发展中。 不过,在市场规模扩大下,扭蛋机行业的竞争力也在同时加大,企业商家需要在市场竞争中寻求发展新思路&#xf…

23.HashMap的put方法流程

一、put方法的流程图 二、put方法的执行步骤 首先,根据key值计算哈希值。然后判断table数组是否为空或者数组长度是否为0,是的话则要扩容,resize()。接着,根据哈希值计算数组下标。如果这个下标位置为空&a…

【Linux】Udp_Tcp协议

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:Linux 目录 👉🏻再谈端口号pidof命令 👉🏻UDP协议报文的管理基于UDP协议的应用层协议 👉&#x1…

每日一日 kotori和气球

kotori和气球 (nowcoder.com) 题目描述,就是只要相邻的气球不相同即可, 解题思路 使用高中的排列组合:第一个位置 可以填n种情况 其次后推不可与前一个相同所以可以 填n -1中情况,结果相乘即可 可以使用bigInteger实现 或者说…

8个迹象表明你需要一台新笔记本电脑,看一下你的笔记本是否有其中一个

序言 当你第一次打开你的笔记本电脑的盒子时,它会以最高性能运行,电池寿命更长,过热最小,资源使用效率高。然而,随着笔记本电脑的老化,它将不能满足预期用途。以下几个迹象表明,可能是时候寻找并投资一款新设备了。 你的设备不再具有预期用途 如果你的笔记本电脑不再…

深度盘点解析一家公司的PMO的定位与发展规划

对于一家公司的PMO(项目管理办公室)的定位与发展规划,今天从以下几个方面进行深度盘点和解析,具体如下: 一、PMO的定位 1. 战略与推手:PMO是持续提升组织项目管理水平,实现组织所有项目成功的重要推手。它站在公司战略的高度,从全局视角出发,对公司内部的项目进行统一…

大模型算法(一):从Transformer到ViT再到LLaMA

单任务/单领域模型 深度学习最早的研究集中在针对单个领域或者单个任务设计相应的模型。 对于CV计算机视觉领域,最常用的模型是CNN卷积模型。其中针对计算机视觉中的不同具体任务例如分类任务,目标检测任务,图像分割任务,以CNN作…

程序验证之Dafny--证明霍尔逻辑的半自动化利器

一、What is Dafny?【来自官网介绍 Dafny 】 1)介绍 Dafny 是一种支持验证的编程语言,配备了一个静态程序验证器。 通过将复杂的自动推理与熟悉的编程习语和工具相结合,使开发者能够编写可证明正确的代码(相对于 {P}S{Q} 这种…

【企业宣传片】拍摄思维提升,专业影视质感核心揭密,一课搞定

课程下载:【企业宣传片】拍摄-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载:关注我。 课程介绍 大量案例分析宣传片拍摄的痛点要点 根据案例告诉你解决方案,讲透概念 改变你对企业宣传片的思维层级与认知 归纳总结对比不同案…

【C++】:string类的基本使用

目录 引言一,string类对象的常见构造二,string类对象的容量操作三,string类对象的访问及遍历操作四,string类对象的修改操作五,string类非成员函数六,整形与字符串的转换 引言 string 就是我们常说的"…