Flask中配置CORS跨域访问的完整指南
本文详细解析浏览器同源策略与跨域概念,介绍W3C制定的CORS规范。重点讲解如何在Flask后端通过安装flask-cors库,利用@cross_origin装饰器或CORS类进行局部及全局跨域配置,涵盖参数设置与Blueprints隔离配置,帮助开发者解决前后端分离开发中的跨域请求问题。
跨域概念与同源策略解析
1 跨域的理解

跨域场景通常指:浏览器A从服务器B获取了HTML、CSS或JavaScript等静态资源,随后在这些资源中的JavaScript代码通过Ajax技术去访问服务器C的静态资源或发起请求。简而言之,就是浏览器A从服务器B加载的资源,试图去访问服务器C的资源。
同源策略是浏览器的安全机制:当浏览器A从服务器B获取静态资源(如HTML、CSS、JS)时,为了保障用户数据安全,浏览器会限制其中的JavaScript代码只能通过Ajax访问服务器B自身的资源或发起请求。即:资源从哪里加载,就只能访问哪里。
所谓“同源”,是指请求必须满足三个条件完全一致:相同的请求协议(如均为Http或Https)、相同的IP地址、相同的端口号。只有这三个要素全部相同,才被视为同源。
CORS规范与后端处理机制
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请求中带有凭证 |
Flask中CORS的配置方法
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 | 预检请求的有效时长 |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









