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简单获取数组元素个数的方法
Jul 13 Python
Fabric 应用案例
Aug 28 Python
深入学习Python中的上下文管理器与else块
Aug 27 Python
关于反爬虫的一些简单总结
Dec 13 Python
Python使用base64模块进行二进制数据编码详解
Jan 11 Python
人脸识别经典算法一 特征脸方法(Eigenface)
Mar 13 Python
Python数据分析库pandas基本操作方法
Apr 08 Python
python基于物品协同过滤算法实现代码
May 31 Python
pytorch实现focal loss的两种方式小结
Jan 02 Python
TensorFlow 读取CSV数据的实例
Feb 05 Python
python中元组的用法整理
Jun 15 Python
python 基于Apscheduler实现定时任务
Dec 15 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
php.ini中的php-5.2.0配置指令详解
2008/03/27 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
Bootstrap CSS组件之输入框组
2016/12/17 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
在vue中给列表中的奇数行添加class的实现方法
2018/09/05 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
Python3处理文件中每个词的方法
2015/05/22 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
2018/10/31 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
python脚本开机自启的实现方法
2019/06/28 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
日本高岛屋百货购物网站:TAKASHIMAYA
2019/03/24 全球购物
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
高级技校毕业生自荐信
2013/11/18 职场文书
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
岗位聘任书范文
2014/03/29 职场文书
nginx静态资源的服务器配置方法
2022/07/07 Servers