Flask-CORS详解
Flask-CORS是一个Flask扩展,用于简化Flask应用程序中跨来源资源共享(CORS)的处理。跨来源资源共享是一种用于让网页从不同源(也就是不同的域、协议或端口)发起对资源的网络请求的机制。如果不处理CORS,浏览器会阻止这种跨源请求,导致网页无法正常工作。Flask-CORS可以帮助我们轻松地解决这个问题。
安装Flask-CORS
首先,通过pip安装Flask-CORS:
pip install flask-cors
使用Flask-CORS
在Flask应用程序中使用Flask-CORS非常简单。只需要在应用程序初始化时,初始化Flask-CORS扩展,并将它绑定到应用程序上即可。
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
上面的代码片段中,我们导入了Flask和CORS模块,然后在创建Flask应用程序实例后,通过调用CORS(app)
来初始化Flask-CORS扩展。
有时候,我们可能需要对不同的路由使用不同的CORS配置。这时可以使用CORS
对象的app.route
装饰器来实现。
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})
@app.route('/api/data')
def get_data():
return {'data': 'Hello, World!'}
上面的代码片段中,我们通过resources
参数指定了只对/api/*
路由下的请求开启CORS,允许所有来源的请求。其他路由不受影响。
配置CORS选项
Flask-CORS支持多种配置选项,可以通过传递CORS
扩展初始化时的参数来配置。下面是一些常用的配置选项:
origins
: 一个允许的来源列表,可以是一个字符串、列表或正则表达式。methods
: 允许的HTTP请求方法列表,如GET
、POST
等。headers
: 允许的请求头列表。expose_headers
: 允许前端访问的响应头列表。supports_credentials
: 是否允许发送凭证信息(如cookies)。max_age
: 预检请求的有效期。
下面是一个示例代码,展示了如何使用这些配置选项:
app = Flask(__name__)
CORS(app, origins='https://www.example.com', supports_credentials=True)
预检请求(Preflight Requests)
当浏览器发起某些跨源请求时(如带有自定义头部或使用某些HTTP方法),浏览器会先发送一个预检请求(Preflight Request),以确定服务器是否支持跨源请求。Flask-CORS可以处理这些预检请求。
@app.route('/api/data', methods=['POST'], cors_allow_methods=['GET', 'POST'])
def post_data():
return {'data': 'Posted data!'}
上面的代码片段中,我们通过methods
参数指定了该路由允许的HTTP方法为POST
,并且指定了允许的CORS方法为GET
和POST
。当浏览器发送跨源POST请求时,先会发送一个OPTIONS预检请求,服务器会返回一个包含Access-Control-Allow-Methods
头的响应,告诉浏览器该路由支持的方法。
运行示例
FLASK_APP=app.py flask run
在浏览器中打开http://127.0.0.1:5000/api/data
,正常情况下应该能够看到返回的数据。
总结
通过使用Flask-CORS扩展,我们可以方便地处理Flask应用程序中跨源资源共享的问题。Flask-CORS提供了灵活的配置选项,可以根据需要来配置CORS的行为。