DRF 跨域问题

news2024/11/15 11:56:58

【一】说明

  • 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.coloradmin.cn/o/1679975.html

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

相关文章

社媒市场规模增长80%,户外运动热潮来袭,品牌如何挖掘蓝海机会?

近年来,越来越多的人开始远离城市喧嚣,走到户外拥抱大自然。Citywalk、露营、登山、徒步、钓鱼、冲浪、骑行、攀岩……户外的边界不断拓宽,可以爬山涉水,也可以只是在公园胡同里遛弯。 户外运动逐渐趋向大众化和日常化。据相关部门…

Java中的数组、Set、List、Map类型的互相转换总结

序言 数组、Set、List、Map是Java语言非常常用的几种数据类型,他们之间存在着千丝万缕的联系。关于底层的数据结构我这里就不再多说啦,直接从应用出发,总结他们之间的转换方法,并给出推荐方法。 大家可以点赞收藏等到需要的时候…

(保姆级教程傻瓜式操作)树莓派--基于opencv实现人脸识别

前言 因为当时没有边实验边记录,所以这篇文章可能存在疏漏。不过很多地方我推荐了我参考过的博客或者视频,希望尽可能地解答您的疑惑,如果您仍有不懂的地方,欢迎评论,如果我知道答案,我会很乐意为您解答。 …

电脑缺失api-ms-win-crt-runtime-l1-1-0.dll文件的几种修复方法

当您在使用电脑过程中遇到程序启动失败,提示缺少“api-ms-win-crt-runtime-l1-1-0.dll”文件时,不必过于焦虑,此问题通常与Windows系统的Visual C Redistributable组件未正确安装或损坏有关。小编将介绍5种修复电脑缺失api-ms-win-crt-runtim…

jiebaNET中文分词器

最近我接手了一个有趣的需求,需要对用户评价进行分词,进行词频统计和情绪分析,并且根据词频权重制成词云图以供后台数据统计,于是我便引入了jieba分词器,但是我发现网上关于jiebaNET相关文档实在太少了,甚至连配置文件…

Maven依赖管理项目构建

Maven依赖管理项目构建工具 目录 文章目录 Maven依赖管理项目构建工具目录一、Maven简介1、为什么学习Maven1.1、Maven是一个依赖管理工具1.2、Maven是一个构建工具1.3、结论 2. Maven介绍3. Maven软件工作原理模型图(了解) 二、Maven安装和配置1. Mave…

链接表存储图(C++注释详解): 构建表 深度优先遍历 (DFS)

链接表的结构体单元: #define size 100 typedef struct node {int idx;//下一个节点的索引int wt;//权重, 也可根据实际情景存储边的信息struct node* next; }Node; Node* hd[size]; // 存储图的邻接表 链接表的的构建: int main() {int n, m;cin >> n >> m; //…

Win11把应用程序添加到开机自启动中

通过WinR命令打开“运行”,输入shell:startup 进入到如图目录: 将想要自动启动的应用的快捷方式都拷贝进来。 之后在任务管理器中就能发现它了。

ipa 功能包调试,分区算法,覆盖算法测试

参考 wiki 流网络 flow network 解释 相关文章 ipa 分区算法 ipa 分区算法总结,部分算法图解 环境 ubuntu20,ros 版本 noetic 运行测试 按照 readme 提示进行测试,跳过第一个步骤,并不需要 turtlebot3。 执行第三个 launch 报…

Go微服务开源框架kratos的依赖注入关系总结

该文章为学习开源微服务框架kratos的学习笔记!官方文档见:简介 | Kratos Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具。 一、Kratos 项目结构简介 通过 Kratos 工具生成的 Go工程化项目模板如下: applicati…

界面组件DevExpress Reporting v24.1预览版 - 拥有原生Angular报表查看器

DevExpress Reporting是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。 下一个主要更新(v24.1)将于6月初发布&#xff…

基于java的超级玛丽游戏的设计与实现(论文 + 源码)

Java的超级玛丽游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89313347 基于java的超级玛丽游戏的设计与实现 摘要 近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用。J2SE称…

基于网络爬虫技术的网络新闻分析(二)

目录 2 系统需求分析 2.1 系统需求概述 2.2 系统需求分析 2.2.1 系统功能要求 2.2.2 系统IPO图 2.2 系统非功能性需求分析 3 系统概要设计 3.1 设计约束 3.1.1 需求约束 3.1.2 设计策略 3.1.3 技术实现 3.3 模块结构 3.3.1 模块结构图 3.3.2 系统层次图 3.3.3…

strcpy函数详解

strcpy函数详解 1.函数简介2.strcpy函数的使用2.1使用方法一2.1使用方法二 3.strcpy在使用过程中的注意事项3.1被复制字符必须以\0结尾3.2目标空间必须能够大于源字符串长度3.3目标空间必须可变 1.函数简介 strcpy函数包含在<string.h>库函数中&#xff0c;是将一个字符…

计算机Java项目|springboot母婴商城系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

GAME101-Lecture07学习

前言 今天主要讲shading&#xff08;着色&#xff09;。在讲着色前&#xff0c;要先讲图形中三角形出现遮挡问题的方法&#xff08;深度缓存或缓冲&#xff09;。 先采样再模糊错误&#xff1a;对信号的频谱进行翻译&#xff08;在这期间会有频谱的混叠&#xff09;&#xff…

Lora训练Windows[笔记]

一. 使用kohya_ss的GUI版本&#xff08;https://github.com/bmaltais/kohya_ss.git&#xff09; 这个版本跟stable-diffusion-webui的界面很像&#xff0c;只不过是训练模型专用而已&#xff0c;打开的端口同样是7860。 1.双击setup.bat,选择1安装好xformers,pytorch等和cuda…

k8s 二进制安装 优化架构之 部署负载均衡,加入master02

目录 一 实验环境 二 部署 CoreDNS 1&#xff0c;所有node加载coredns.tar 镜像 2&#xff0c;在 master01 节点部署 CoreDNS 3&#xff0c; DNS 解析测试 4&#xff0c; 报错分析 5&#xff0c;重新 DNS 解析测试 三 master02 节点部署 1&#xff0…

Python数据分析与数据可视化 概念

考试题型&#xff1a; 一、填空题&#xff08;1分*10&#xff09; 二、程序代码填空&#xff08;1分*20&#xff09; 三、读程序写结果&#xff08;10分*4&#xff09; 四、程序设计&#xff08;10分*1&#xff09; 五、问答题&#xff08;20分*1&#xff09; 考试范围&#x…

【Pytorch】10.CIFAR10模型搭建

CIFAR10模型 是torchvision中官方给出的一个数据集,可以通过 dataset torchvision.datasets.CIFAR10(./data, trainFalse, downloadTrue, transformtorchvision.transforms.ToTensor())来下载到指定文件夹 搭建CIFAR10模型 首先我们先去搜一下CIFAR10 model structure 可以看…