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的迭代器和生成器使用实例
Jan 14 Python
编写Python CGI脚本的教程
Jun 29 Python
代码分析Python地图坐标转换
Feb 08 Python
利用Python批量提取Win10锁屏壁纸实战教程
Mar 27 Python
python微元法计算函数曲线长度的方法
Nov 08 Python
python中的colorlog库使用详解
Jul 05 Python
详细介绍pandas的DataFrame的append方法使用
Jul 31 Python
python 三元运算符使用解析
Sep 16 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
对python中list的五种查找方法说明
Jul 13 Python
python3.7.2 tkinter entry框限定输入数字的操作
May 22 Python
详解Python中的进程和线程
Jun 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
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
PHP学习之PHP表达式
2006/10/09 PHP
简单的PHP缓存设计实现代码
2011/09/30 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
javascript读取RSS数据
2007/01/20 Javascript
不错的JS中变量相关的细节分析
2007/08/13 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
javascript最基本的函数汇总
2015/06/25 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
2017/06/02 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
JavaScript 几种循环方式以及模块化的总结
2020/09/03 Javascript
[01:08:57]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第二场
2014/05/24 DOTA
从零学Python之引用和类属性的初步理解
2014/05/15 Python
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
Python 切分数组实例解析
2019/11/07 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
荷兰网上药店:Drogisterij.net
2019/09/03 全球购物
服务之星获奖感言
2014/01/21 职场文书
岗位职责风险点
2014/03/12 职场文书
2014年英语教学工作总结
2014/12/17 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫
详解如何使用Nginx解决跨域问题
2022/05/06 Servers
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android