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 相关文章推荐
python3使用urllib示例取googletranslate(谷歌翻译)
Jan 23 Python
Python实现全角半角转换的方法
Aug 18 Python
Python中最常用的操作列表的几种方法归纳
Apr 24 Python
详解Python的Django框架中的Cookie相关处理
Jul 22 Python
Python上传package到Pypi(代码简单)
Feb 06 Python
Python的时间模块datetime详解
Apr 17 Python
python实现飞机大战微信小游戏
Mar 21 Python
Python之inspect模块实现获取加载模块路径的方法
Oct 16 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 Python
PyQt5中多线程模块QThread使用方法的实现
Jan 31 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
Jun 29 Python
python 常用的异步框架汇总整理
Jun 18 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 求质素(素数) 的实现代码
2011/04/12 PHP
Drupal7 form表单二次开发要点与实例
2014/03/02 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
js 处理URL实用技巧
2010/11/23 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
Javascript实现简单二级下拉菜单实例
2014/06/15 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
在vue项目中使用sass的配置方法
2018/03/20 Javascript
vue将文件/图片批量打包下载zip的教程
2020/10/21 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
[02:51]2014DOTA2 TI小组赛总结中国军团全部进军钥匙球馆
2014/07/15 DOTA
python文件和目录操作函数小结
2014/07/11 Python
浅谈python3中input输入的使用
2019/08/02 Python
python使用requests.session模拟登录
2019/08/09 Python
python如何把字符串类型list转换成list
2020/02/18 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
python软件都是免费的吗
2020/06/18 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
作风年建设汇报材料
2014/08/14 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS