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实现Linux下守护进程的编写方法
Aug 22 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
Jun 12 Python
利用Python实现Shp格式向GeoJSON的转换方法
Jul 09 Python
django 通过url实现简单的权限控制的例子
Aug 16 Python
Python 单例设计模式用法实例分析
Sep 23 Python
pygame实现成语填空游戏
Oct 29 Python
Python 使用type来定义类的实现
Nov 19 Python
python实现超级玛丽游戏
Mar 18 Python
opencv实现图像几何变换
Mar 24 Python
python学习之panda数据分析核心支持库
May 07 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的FTP学习(一)[转自奥索]
2006/10/09 PHP
留言板翻页的实现详解
2006/10/09 PHP
分享一个php 的异常处理程序
2014/06/22 PHP
php查询及多条件查询
2017/02/26 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
根据json字符串生成Html的一种方式
2013/01/09 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
js中数组对象去重的两种方法
2019/01/18 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
jQuery实现简单弹幕制作
2020/12/10 jQuery
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
Python实现拼接多张图片的方法
2014/12/01 Python
Python实现各种排序算法的代码示例总结
2015/12/11 Python
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
Python深度优先算法生成迷宫
2018/01/22 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
Python列表推导式与生成器表达式用法示例
2018/02/08 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
英国版MAC彩妆品牌:Illamasqua
2018/04/18 全球购物
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
请描述一下”is a”关系和”has a”关系
2015/02/03 面试题
2014教师党员个人自我评议
2014/09/20 职场文书
行政处罚事先告知书
2015/07/01 职场文书
2016年中秋节慰问信
2015/12/01 职场文书
深入理解以DEBUG方式线程的底层运行原理
2021/06/21 Java/Android