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.mzph.cn/web/12880.shtml

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

相关文章

error Error: certificate has expired

用yarn命令安装依赖的时候遇到报错: 原因:可能是开了服务器代理访问导致ssl安全证书失效 解决方法: 在终端输入 yarn config set "strict-ssl" false -g yarn config set "strict-ssl" false -g 然后再安装依赖就不…

RS2227XN功能和参数介绍及PDF资料

RS2227XN是一款模拟开关/多路复用器 品牌: RUNIC(润石) 封装: MSOP-10 描述: USB2.0高速模拟开关 开关电路: 双刀双掷(DPDT) 通道数: 2 工作电压: 1.8V~5.5V 导通电阻(RonVCC): 10Ω 功能:模拟开关/多路复用器 USB2.0高速模拟开关 工作电压范围:1.8V ~ 5…

Linux运行级别介绍

unlevel 运行级别 cat /etc/inittab 0 - halt (Do NOT set initdefault to this) --关机 1 - Single user mode --单用户(进入单用户不需要帐号与密码) 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 多用户(没有网络) 3…

Java基础篇常见面试问题总结

文章目录 1. 你是怎样理解 OOP面向对象?2. 重载与重写区别3. 接口与抽象类的区别4. 深拷贝与浅拷贝的理解5. 什么是自动拆装箱? int和 Integer有什么区别6. 和 equals()区别7. String类 能被继承吗为什么用 final修饰8. final、finally、finalize区别 1. 你是怎样理…

【C语言】6.C语言VS实用调试技巧(1)

文章目录 1.什么是 bug2.什么是调试(debug)?3.Debug 和 Release4.VS调试快捷键4.1 环境准备4.2 调试快捷键 5.监视和内存观察5.1 监视5.2 内存 1.什么是 bug bug现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题…

Git使用(3):版本管理

一、查看历史 编写一个java类进行测试 选择Git -> Show Git Log查看日志。 第一次修改推送到远程仓库了,所以有origin(远程仓库地址),第二次修改只提交到本地仓库所以没有。 二、版本回退 1、本地回退 在要回退的版本上右键&a…

XLSX文件删除了怎么找回?8个恢复方法,太实用了!

U盘作为一种便携的存储设备,随之而来的数据丢失问题也让人头疼。尤其是当U盘中的XLSX文件(Excel 2007及以后版本的默认文件格式)被误删除或丢失时,如何高效找回这些数据成为了许多人关注的焦点。 本文将从XLSX文件的特性、U盘格式…

C++set关联式容器

Cset 1. 关联式容器 vector、list、deque、forward_list(C11)等STL容器,其底层为线性序列的数据结构,里面存储的是元素本身,这样的容器被统称为序列式容器。而map、set是一种关联式容器,关联式容器也是用来存储数据的&#xff0…

深度盘点在当今经济形势下资深项目经理或PMO的或去或从

在当今经济形势下,资深项目经理(Project Manager)或项目管理办公室(PMO)的去向和选择受到多种因素的影响。以下是对他们可能面临的或去或从的深度盘点: 1、发展去向 1. 深化专业领域:在经济形势…

Linux程序开发(一):Linux基础入门安装和实操手册

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

CSAP_MAT_BOM_MAINTAIN 返回消息处理

CSAP_MAT_BOM_MAINTAIN是创建修改BOM的函数,但这个函数的返回参数中没有消息返回。 需要在调用前使用函数: CALL FUNCTION CALO_INIT_APIEXPORTINGdata_reset_sign EXCEPTIONSlog_object_not_found 1log_sub_object_not_found 2other_e…

QT笔记 - QPainter 填充环形区域(甜甜圈)

以矩形为例: QPainter painter(this);// painter.setPen(Qt::blue);// painter.setFont(QFont("Arial",30));// painter.drawText(rect(),Qt::AlignCenter,"Hello Qt!!!");QRect rect QRect(50, 50, 400, 400);QRect box QRect(100, 100, 105…

TS-抽象类和静态成员

目录 1,抽象类1,为什么需要抽象类2,抽象成员3,设计模式-模板模式 2,静态成员1,什么是静态成员2,设计模式-单例模式 1,抽象类 1,为什么需要抽象类 有时,某个…

Java面试八股之Java中有哪些原子类,原理是什么

Java中有哪些原子类,原理是什么 AtomicInteger 和 AtomicLong: 用于对整数(int)和长整数(long)进行原子操作。 原理:它们内部封装了一个整型或长整型变量,并通过使用Unsafe类提供…

HarmonyOS - 记一次HSP异常堆栈无法定位问题

问题背景 HSP混淆打包之后无法定位异常堆栈,问题堆栈为: MyModules/build/default/cache/default/defaultCompileArkTS/esmodule/release/MyModules/src/main/ets/d/r.ts:1:1 问题原因: 导致无法定位问题的原因是,混淆时开启了代码…

OpenHarmony 实战开发——ArkUI容器类API介绍

容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法。在 ArkUI 开发框架中,容器类采用了类似静态的语言来实现,并通过 NAPI 框架对外提供。通过对存储位置以及属性的限制&#x…

关于数据结构B+TREE 和 HASH的整理

一、BTREE BTree是一种树数据结构,是B-Tree的变种,属于n叉排序树,每个节点通常有多个孩子。 BTree是和B-Tree相比,BTree的所有的数据都会出现在叶子节点上,并且叶子节点会形成一个单向链表,非叶子节点仅仅…

C++map容器关联式容器

Cmap 1. 关联式容器 vector、list、deque、forward_list(C11)等STL容器,其底层为线性序列的数据结构,里面存储的是元素本身,这样的容器被统称为序列式容器。而map、set是一种关联式容器,关联式容器也是用来存储数据的&#xff0…

日期问题,

日期问题 ac代码 #include <cstdio> #include <iostream>using namespace std;int days[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};bool check_valid(int year, int month, int day) {if (month 0 || month > 12) return false;if (day 0) …

【开发】模型部署笔记

目录 模型量化 模型量化 1、模型量化优点 低精度模型表示模型权重数值格式为FP16&#xff08;半精度浮点&#xff09;或者INT8&#xff08;8位定点整数&#xff09;&#xff0c;但是目前低精度往往就指代INT8。常规精度模型则一般表示模型权重数值格式为FP32&#xff08;32位…