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 (1)
Oct 31 Python
python笔记:mysql、redis操作方法
Jun 28 Python
Python 处理数据的实例详解
Aug 10 Python
在Django中URL正则表达式匹配的方法
Dec 20 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
python numpy实现文件存取的示例代码
May 26 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
Nov 29 Python
django 前端页面如何实现显示前N条数据
Mar 16 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
python关于集合的知识案例详解
May 30 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
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
Netbeans 8.2将支持PHP7 更精彩
2016/06/13 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
jQuery中 bind的用法简单介绍
2017/02/13 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python创建模块及模块导入的方法
2015/05/27 Python
详解Python的Django框架中的模版相关知识
2015/07/15 Python
python字典操作实例详解
2017/11/16 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
浅谈Python 递归算法指归
2019/08/22 Python
django之从html页面表单获取输入的数据实例
2020/03/16 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
电大会计学自我鉴定
2014/02/06 职场文书
公司门卫的岗位职责
2014/02/19 职场文书
社区健康教育实施方案
2014/03/18 职场文书
opencv-python图像配准(匹配和叠加)的实现
2021/06/23 Python
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL
Python创建SQL数据库流程逐步讲解
2022/09/23 Python