sea*_*ean 4 python cors flask flask-cors
我已经查看了许多 SO 答案,但似乎找不到这个问题。我有一种感觉,我只是错过了一些明显的东西。
我有一个基本的 Flask api,并且我已经实现了 flask_cors 扩展和自定义 Flask 装饰器[@crossdomain from Armin Ronacher]。1 ( http://flask.pocoo.org/snippets/56/ ) 两者都显示相同的问题。
这是我的示例应用程序:
application = Flask(__name__,
static_url_path='',
static_folder='static')
CORS(application)
application.config['CORS_HEADERS'] = 'Content-Type'
@application.route('/api/v1.0/example')
@cross_origin(origins=['http://example.com'])
# @crossdomain(origin='http://example.com')
def api_example():
print(request.headers)
response = jsonify({'key': 'value'})
print(response.headers)
return response
Run Code Online (Sandbox Code Playgroud)
(插入编辑 3):
当我在浏览器中(从 127.0.0.1 开始)从 JS 向该端点发出 GET 请求时,它总是返回 200,我希望看到:
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:5000' is therefore not allowed access. The response had HTTP status code 403.
Run Code Online (Sandbox Code Playgroud)
卷曲:
ACCT:ENVIRON user$ curl -i http://127.0.0.1:5000/api/v1.0/example
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 20
Access-Control-Allow-Origin: http://example.com
Server: Werkzeug/0.11.4 Python/2.7.11
Date: [datetime]
{
"key": "value"
}
Run Code Online (Sandbox Code Playgroud)
日志:
Content-Length:
User-Agent: curl/7.54.0
Host: 127.0.0.1:5000
Accept: */*
Content-Type:
Content-Type: application/json
Content-Length: 20
127.0.0.1 - - [datetime] "GET /api/v1.0/example HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)
我什至没有在响应中看到所有正确的标头,而且它似乎并不关心请求中的来源是什么。
任何想法我错过了什么?谢谢!
编辑:
作为旁注,查看此处的文档示例(https://flask-cors.readthedocs.io/en/v1.7.4/#a-more-complicated-example),它显示:
@app.route("/")
def helloWorld():
'''
Since the path '/' does not match the regular expression r'/api/*',
this route does not have CORS headers set.
'''
return '''This view is not exposed over CORS.'''
Run Code Online (Sandbox Code Playgroud)
...这很有趣,因为我已经暴露了没有任何 CORS 装饰的根路径(和其他路径),并且它们从任何来源都可以正常工作。因此,这种设置似乎存在根本性的错误。
沿着这些思路,这里的教程(https://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask)似乎表明 Flask api 应该在没有保护的情况下自然暴露(我假设那只是因为尚未应用 CORS 扩展),但我的应用程序基本上只是像 CORS 扩展甚至不存在一样运行(除了您可以看到的日志中的一些注释)。
编辑2:
我的评论不清楚,所以我在 AWS API Gateway 上使用不同的 CORS 设置创建了三个示例端点。它们是简单地返回“成功”的 GET 方法端点:
1) 未启用 CORS(默认):
回复:
XMLHttpRequest 无法加载 https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-default。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问源“ http://127.0.0.1:5000 ”。响应具有 HTTP 状态代码 403。
2) 启用 CORS - 来源受限:
访问控制允许标题:'内容类型'
访问控制允许来源:' http://example.com '
回复:
XMLHttpRequest 无法加载 https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-enabled-example。对预检请求的响应未通过访问控制检查:“Access-Control-Allow-Origin”标头的值“ http://example.com ”不等于提供的来源。因此不允许访问源“ http://127.0.0.1:5000 ”。
3) 启用 CORS - Origin 通配符:
回复:
"success"
Run Code Online (Sandbox Code Playgroud)
我对基础设施的经验并不丰富,但我的期望是启用 Flask CORS 扩展会导致我的 api 端点模仿这种行为,具体取决于我在origins=
设置中设置的内容。我在这个 Flask 设置中缺少什么?
解决方案编辑:
好吧,考虑到我的某些事情显然不正常,我精简了我的应用程序,并为 CORS 源限制的每个变体重新实现了一些非常基本的 API。我一直在使用 AWS 的 elastic beanstalk 来托管测试环境,因此我重新上传了这些示例并向每个示例运行了一个 JS ajax 请求。它现在正在工作。
我Access-Control-Allow-Origin
在裸端点上收到错误。看来,当我为部署配置应用程序时,我取消了注释CORS(application, resources=r'/api/*')
,这显然允许裸端点的所有来源!
我不确定为什么我的具有特定限制 ( origins=[]
) 的路线也允许所有内容,但这一定是某种类型的错字或小问题,因为它现在正在工作。
特别感谢sideshowbarker的所有帮助!
根据您的问题,目前尚不完全清楚您期望的行为。但就 CORS 协议的工作方式而言,您的服务器似乎已经按预期运行。
具体来说,curl
问题中引用的响应显示了此响应标头:
Access-Control-Allow-Origin: http://example.com
Run Code Online (Sandbox Code Playgroud)
这表明服务器已经配置为告诉浏览器,如果代码在源处运行,则仅允许来自浏览器中运行的前端 JavaScript 代码的跨源请求http://example.com
。
如果您期望的行为是服务器现在将拒绝来自非浏览器客户端(例如 )的请求curl
,那么 CORS 配置本身不会导致服务器这样做。
当您使用 CORS 支持对其进行配置时,服务器所做的唯一不同就是发送Access-Control-Allow-Origin
响应标头和其他 CORS 响应标头。就是这样。
CORS 限制的实际执行仅由浏览器完成,而不是由服务器完成。
因此,无论您进行何种服务器端 CORS 配置,服务器仍会继续接受来自所有客户端和源的请求;换句话说,来自所有来源的所有客户端仍然像其他方式一样继续从服务器获取响应。
但是,如果请求被发送到选择加入的服务器通过使用允许该源的标头响应来允许该请求,则浏览器只会将来自跨源请求的响应暴露给在特定源上运行的前端 JavsScript 代码Access-Control-Allow-Origin
。
这是您使用 CORS 配置唯一可以做的事情。您不能仅通过执行任何服务器端 CORS 配置来使服务器仅接受和响应来自特定来源的请求。为此,您需要使用的不仅仅是 CORS 配置。
归档时间: |
|
查看次数: |
12196 次 |
最近记录: |