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中用altzone()方法处理时区的教程
May 22 Python
Python编程中对super函数的正确理解和用法解析
Jul 02 Python
浅谈django model的get和filter方法的区别(必看篇)
May 23 Python
浅谈Python peewee 使用经验
Oct 20 Python
Python装饰器(decorator)定义与用法详解
Feb 09 Python
使用Python对微信好友进行数据分析
Jun 27 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
Dec 24 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
Django实现列表页商品数据返回教程
Apr 03 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
May 15 Python
Python基于pyjnius库实现访问java类
Jul 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
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
jquery图片放大功能简单实现
2013/08/01 Javascript
div模拟选择框示例代码
2013/11/03 Javascript
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
前端开发之便利店收银系统代码
2019/12/27 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
python paramiko实现ssh远程访问的方法
2013/12/03 Python
Python爬取读者并制作成PDF
2015/03/10 Python
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
C语言笔试题回忆
2015/04/02 面试题
《临死前的严监生》教学反思
2014/02/13 职场文书
迟到检讨书300字
2014/02/14 职场文书
竞赛口号大全
2014/06/16 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
2015年药房工作总结
2015/04/25 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
SQL Server数据定义——模式与基本表操作
2021/04/05 SQL Server
Java实现聊天机器人完善版
2021/07/04 Java/Android
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server