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爬取csdn博客访问量
Feb 14 Python
Python+Wordpress制作小说站
Apr 14 Python
Pycharm学习教程(1) 定制外观
May 02 Python
python方向键控制上下左右代码
Jan 20 Python
python 利用栈和队列模拟递归的过程
May 29 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
Python中base64与xml取值结合问题
Dec 22 Python
django表单中的按钮获取数据的实例分析
Jul 31 Python
python中count函数知识点浅析
Dec 17 Python
Python requests库参数提交的注意事项总结
Mar 29 Python
python引入其他文件夹下的py文件具体方法
May 23 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 mssql 数据库分页SQL语句
2008/12/16 PHP
一道求$b相对于$a的相对路径的php代码
2010/08/08 PHP
PHP图片上传代码
2013/11/04 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
动手学习无线电
2021/03/10 无线电
用 JavaScript 迁移目录
2006/12/18 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
TBCompressor js代码压缩
2011/01/05 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
javascript弹出页面回传值的方法
2015/01/28 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
JavaScript函数内部属性和函数方法实例详解
2016/03/17 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
2016/06/01 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
python抓取网页内容示例分享
2014/02/24 Python
Python文件操作基本流程代码实例
2017/12/11 Python
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
TensorFlow变量管理详解
2018/03/10 Python
python selenium自动上传有赞单号的操作方法
2018/07/05 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
2019/08/02 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
python数据抓取3种方法总结
2021/02/07 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
2021/02/20 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
考试作弊万能检讨书
2014/10/19 职场文书
2014年教育培训工作总结
2014/12/08 职场文书