Django跨域资源共享问题(推荐)


Posted in Python onMarch 09, 2020

最近做了一个前后端分离的web项目,其中我司职后端,使用django框架。在前后端集成测试的时候,就遇到了一些web安全相关的问题,cors跨域资源共享就是其中之一。

cors问题介绍

跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。 CORS机制允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。现代浏览器支持在API容器中使用CORS,以降低跨域 HTTP 请求所带来的风险。

一个域是由协议、主机和端口号组成的,简单地说,当两个url的协议、主机和端口中存在一个不同时,它们属于不同域,那么它们之间的互相访问就会产生跨域访问问题。

Django跨域资源共享问题(推荐)

我的项目中,前端的地址是 http://localhost:8001 ,后端的地址是 http://localhost:8000 ,两个地址的协议和主机都相同,但是端口号不同,因此,前端调用后端接口时,就会产生跨域访问的问题。

简单请求

简单请求不会触发跨域访问中的预检请求,满足下列条件的为简单请求:

使用下列方法之一

GET
HEAD
POST

headers字段集合主要包含以下类型:

  • Accept
  • Accept-Language
  • Content-Language
  • Content-type : text/plain 、 multipart/form-data 和 application/x-www-form-urlencoded
  • DRP
  • DownLink
  • Save-Data
  • Viewport-Width
  • Width

非简单请求

非简单请求即不满足简单请求条件的请求。非简单请求在发出请求前需要先发送一个预检请求,请求方法为 OPTIONS 方法。预检请求的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。 当请求满足下述任一条件时,即应首先发送预检请求:

使用了以下的HTTP方法:

PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH

首部字段里面包含了非简单请求的头部字段的字段

django中遇到的问题

在后台开发中,就遇到了这样的情况

Django跨域资源共享问题(推荐)

错误提示中显示,请求被 CORS 协议阻拦。

Django跨域资源共享问题(推荐)

这里的 Origin 字段说明了请求源地址,采用了 OPTIONS 方法,然后发出请求的地址 Host
就是本机地址。下面是服务器的响应,但是没有发出实际请求

Django跨域资源共享问题(推荐)

然后,为了解决这一问题,我搜索过后,安装了django-cors-headers库,并且进行了配置,这里配置时我把django-cors-headers中间件放在了中间件第一位。再次访问同样的地址,结果如下:

Django跨域资源共享问题(推荐)

1.首先,浏览器检测访问的请求头中的字段,存在对 CORS 安全的首部字段集合之外的字段,所以,向服务器发送一个预检请求。上图可见,方法为 OPTIONS ,该方法不会对服务器资源产生影响。其中的请求头中的 Access-Control-Request-Method 字段表明实际请求会采用 GET 方法, Origin 表示请求源,会在服务器中接受验证。

2.验证通过后,会在 response 请求头添加不同的字段进行返回, 字段的意思如下:

  • 首部字段 Access-Control-Allow-Headers :表示服务器允许的头部字段。
  • 首部字段 Access-Control-Allow-Methods :表明服务器允许客户端使用 POST , GET 和 OPTIONS 等等方法发起请求。
  • 首部字段 Access-Control-Allow-Origin :表示服务器允许的请求源。
  • 首部字段 Access-Control-Max-Age :表明该响应的有效时间为86400秒,也就是24 小时。在有效时间内,浏览器无须为同一请求再次发起预检请求。

3.然后,客户端会发出实际请求,从结果上来看,预检请求的 response 请求体中没有任何信息,而实际请求则携带了服务器返回的信息。不难看出,预检请求确实就是与服务器提前沟通,获取与服务器相关信息的。

简单的总结

非简单请求需要发送预检请求进行判断,然后服务端与客户端需要在头部字段上达成一致,这样才能正常访问。不过,在django的开发中,直接使用django-cors-headers库以后,只需要简单的配置就能够很好的解决问题。

到此这篇关于Django跨域资源共享问题小结的文章就介绍到这了,更多相关django跨域资源共享内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python字符串加密解密的三种方法分享(base64 win32com)
Jan 19 Python
九步学会Python装饰器
May 09 Python
Python函数返回值实例分析
Jun 08 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
Apr 21 Python
Centos7 Python3下安装scrapy的详细步骤
Mar 15 Python
Python2.7.10以上pip更新及其他包的安装教程
Jun 12 Python
python实现顺序表的简单代码
Sep 28 Python
对python借助百度云API对评论进行观点抽取的方法详解
Feb 21 Python
Python中的引用知识点总结
May 20 Python
django表单的Widgets使用详解
Jul 22 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 #Python
Python模块相关知识点小结
Mar 09 #Python
Django操作session 的方法
Mar 09 #Python
Python装饰器用法与知识点小结
Mar 09 #Python
Django中的session用法详解
Mar 09 #Python
python实现引用其他路径包里面的模块
Mar 09 #Python
python+opencv边缘提取与各函数参数解析
Mar 09 #Python
You might like
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
用php实现选择排序的解决方法
2013/05/04 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
AngularJS ng-controller 指令简单实例
2016/08/01 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
vue脚手架搭建过程图解
2018/06/06 Javascript
express启用https使用小记
2019/05/21 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[03:06]V社市场总监Dota2项目负责人Erik专访:希望更多中国玩家加入DOTA2
2014/07/11 DOTA
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
简单解析Django框架中的表单验证
2015/07/17 Python
Python实现读取并保存文件的类
2017/05/11 Python
Python合并多个Excel数据的方法
2018/07/16 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
python数据分析:关键字提取方式
2020/02/24 Python
python中if及if-else如何使用
2020/06/02 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
AmazeUI的JS表单验证框架实战示例分享
2020/08/21 HTML / CSS
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
2014年心理健康教育工作总结
2014/12/06 职场文书
MySQL之高可用集群部署及故障切换实现
2021/04/22 MySQL
html form表单基础入门案例讲解
2021/07/21 HTML / CSS
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL