Flask配置Cors跨域的实现


Posted in Python onJuly 12, 2019

1 跨域的理解

Flask配置Cors跨域的实现

跨域是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,然后在Js中通过Ajax访问C服务器的静态资源或请求。即:浏览器A从B服务器拿的资源,资源中想访问服务器C的资源。

同源策略是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,为了用户安全,浏览器加了限制,其中的Js通过Ajax只能访问B服务器的静态资源或请求。即:浏览器A从哪拿的资源,那资源中就只能访问哪。

同源是指:同一个请求协议(如:Http或Https)、同一个Ip、同一个端口,3个全部相同,即为同源。

2 跨域的处理

跨域的这种需求还是有的,因此,W3C组织制定了一个Cross-Origin Resource Sharing规范,简写为Cors,现在这个规范已经被大多数浏览器支持,从而,处理跨域的需求。

Cors需要在后端应用进行配置,因此,是一种跨域的后端处理方式,这么做也容易理解,一个你不认识的源来访问你的应用,自然需要应用进行授权。除了后端处理方式,也有前端的解决方案,如:JSONP,因这里我们主要讲解Flask对Cors的配置,暂不对前端解决方案进行详细说明。

3 跨域的分类

跨域分为以下3种

名称 英文名 说明
简单请求 Simple Request 发起的Http请求符合: 1.无自定义请求头, 2.请求动词为GET、HEAD或POST之一, 3.动词为POST时,Content-Type是application/x-www-form-urlencoded, multipart/form-data或text/plain之一
预检请求 Preflighted Request 发起的Http请求符合其中之一: 1.包含了自定义请求头, 2.请求动词不是GET、HEAD或POST, 3.动词是POST时, Content-Type不是application/x-www-form-urlencoded, multipart/form-data或text/plain。 即:简单请求的相反
凭证请求 Requests with Credential 发起的Http请求中带有凭证

4 Flask配置Cors

Flask配Cors跨域,使用Flask-CORS包,详细文档,参见: https://flask-cors.readthedocs.io/en/latest/,总的来说,flask-cors包也提供了两种方式

方式 范围 说明
@cross_origin装饰器 配置单个路由 适用于配置特定的API接口
CORS函数 配置全局API接口 适用于全局的API接口配置

4.1 安装flask-cors

pip install flask-cors

4.2 使用@cross_origin装饰器

@app.route("/")
@cross_origin()
def helloWorld():
 return "Hello, cross-origin-world!"

装饰器参数 类型 Head字段 说明
origins 列表、字符串或正则表达式 Access-Control-Allow-Origin 配置允许跨域访问的源, *表示全部允许
methods 列表、字符串 Access-Control-Allow-Methods 配置跨域支持的请求方式, 如:GET、POST
expose_headers 列表、字符串 Access-Control-Expose-Headers 自定义请求响应的Head信息
allow_headers 列表、字符串或正则表达式 Access-Control-Request-Headers 配置允许跨域的请求头
supports_credentials 布尔值 Access-Control-Allow-Credentials 是否允许请求发送cookie, false是不允许
max_age 整数、字符串 Access-Control-Max-Age 预检请求的有效时长

4.3 使用CORS函数

4.3.1 应用全局配置

app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})

@app.route("/api/v1/users")
def list_users():
 return "user example"

4.3.2 单独Blueprints配置

api_v1 = Blueprint('API_v1', __name__)
CORS(api_v1) 

@api_v1.route("/api/v1/users/")
def list_users():
 return "user example"

4.3.3 CORS参数说明

参数 类型 Head字段 说明
resources 字典、迭代器或字符串 全局配置允许跨域的API接口
origins 列表、字符串或正则表达式 Access-Control-Allow-Origin 配置允许跨域访问的源, *表示全部允许
methods 列表、字符串 Access-Control-Allow-Methods 配置跨域支持的请求方式, 如:GET、POST
expose_headers 列表、字符串 Access-Control-Expose-Headers 自定义请求响应的Head信息
allow_headers 列表、字符串或正则表达式 Access-Control-Request-Headers 配置允许跨域的请求头
supports_credentials 布尔值 Access-Control-Allow-Credentials 是否允许请求发送cookie, false是不允许
max_age 整数、字符串 Access-Control-Max-Age 预检请求的有效时长

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python导入txt数据到mysql的方法
Apr 08 Python
django 在原有表格添加或删除字段的实例
May 27 Python
详解python使用turtle库来画一朵花
Mar 21 Python
python从入门到精通 windows安装python图文教程
May 18 Python
PyQT5 QTableView显示绑定数据的实例详解
Jun 25 Python
解决python super()调用多重继承函数的问题
Jun 26 Python
Python简单处理坐标排序问题示例
Jul 11 Python
Python 实现黑客帝国中的字符雨的示例代码
Feb 20 Python
python小白切忌乱用表达式
May 29 Python
matplotlib实现数据实时刷新的示例代码
Jan 05 Python
Python采集股票数据并制作可视化柱状图
Apr 04 Python
Python OpenGL基本配置方式
May 20 Python
python调用webservice接口的实现
Jul 12 #Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 #Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 #Python
教你如何编写、保存与运行Python程序的方法
Jul 12 #Python
如何不用安装python就能在.NET里调用Python库
Jul 12 #Python
python 执行终端/控制台命令的例子
Jul 12 #Python
python IDLE 背景以及字体大小的修改方法
Jul 12 #Python
You might like
getimagesize获取图片尺寸实例
2014/11/15 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
php微信开发之自定义菜单完整流程
2016/10/08 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
学习ExtJS Window常用方法
2009/10/07 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
js+html5实现侧滑页面效果
2017/07/15 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
[08:47]DOTA2每周TOP10 精彩击杀集锦vol.6
2014/06/25 DOTA
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
Django中url的反向查询的方法
2018/03/14 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
python基于socket函数实现端口扫描
2020/05/28 Python
Python库安装速度过慢解决方案
2020/07/14 Python
python文件排序的方法总结
2020/09/13 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
纯css3制作网站后台管理面板
2014/12/30 HTML / CSS
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
酷瑞网络科技面试题
2012/03/30 面试题
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
毕业生找工作自荐书
2014/06/30 职场文书
python 逐步回归算法
2021/04/06 Python
Go语言实现Base64、Base58编码与解码
2021/07/26 Golang