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基础知识小结之集合
Nov 25 Python
python fabric实现远程部署
Jan 05 Python
使用Python & Flask 实现RESTful Web API的实例
Sep 19 Python
python爬取网页内容转换为PDF文件
Jul 28 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
python读取图片任意范围区域
Jan 23 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
Python使用os.listdir和os.walk获取文件路径
May 21 Python
详解python 支持向量机(SVM)算法
Sep 18 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
python 实现图与图之间的间距调整subplots_adjust
May 21 Python
Python爬取英雄联盟MSI直播间弹幕并生成词云图
Jun 01 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
构建简单的Webmail系统
2006/10/09 PHP
php 什么是PEAR?(第三篇)
2009/03/19 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
2016/07/01 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
详解vue.js的事件处理器v-on:click
2017/06/27 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
JavaScript中变量提升与函数提升经典实例分析
2018/07/26 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
JS前端广告拦截实现原理解析
2020/02/17 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
详解 Python中LEGB和闭包及装饰器
2017/08/03 Python
Python中常见的异常总结
2018/02/20 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
PyTorch 1.0 正式版已经发布了
2018/12/13 Python
python版DDOS攻击脚本
2019/06/12 Python
Python将字典转换为XML的方法
2020/08/01 Python
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
方正Java笔试题
2014/07/03 面试题
超市营业员求职简历的自我评价
2013/10/17 职场文书
办公室主任岗位职责
2013/11/08 职场文书
2014政务公开实施方案
2014/02/19 职场文书
境外导游求职信
2014/02/27 职场文书
幼儿园开学寄语
2014/04/03 职场文书
学习方法演讲稿
2014/05/10 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书