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基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
Dec 08 Python
python自动化测试之从命令行运行测试用例with verbosity
Sep 28 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 Python
解密Python中的描述符(descriptor)
Jun 03 Python
python在文本开头插入一行的实例
May 02 Python
Flask入门之上传文件到服务器的方法示例
Jul 18 Python
python3在同一行内输入n个数并用列表保存的例子
Jul 20 Python
Python openpyxl模块原理及用法解析
Jan 19 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 Python
python爬取抖音视频的实例分析
Jan 19 Python
一文带你掌握Pyecharts地理数据可视化的方法
Feb 06 Python
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 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
十大“创意”战术!
2020/03/04 星际争霸
PHP截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
浅析JavaScript中的delete运算符
2013/11/30 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
JavaScript实现数组降维详解
2017/01/05 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
详解Python的单元测试
2015/04/28 Python
Python 爬虫图片简单实现
2017/06/01 Python
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
2014端午节活动策划方案
2014/01/27 职场文书
物业管理专业求职信
2014/06/11 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
环卫个人总结
2015/03/03 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
Python-OpenCV教程之图像的位运算详解
2021/06/21 Python
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android