Python Flask CORS

您所在的位置:网站首页 flask如何部署 Python Flask CORS

Python Flask CORS

2022-12-14 02:11| 来源: 网络整理| 查看: 265

我已经浏览了许多SO答案,似乎无法找到此问题。我有一种感觉,我只是想念一些明显的东西。Python Flask CORS - API始终允许任何来源

我有一个基本的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

(编辑3插入):

当我做一个GET请求,以便从JS端点在浏览器中(从127.0.0.1),它总是返回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.

卷曲:

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" }

LOG:

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 -

我还没有看到所有的响应正确的头,它似乎并不关心的来源是在要求什么。

任何想法我失踪了?谢谢!

编辑:

作为一个侧面说明,在看文档例如here(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.'''

...因为我已经有这是颇为有趣根路径(和其他)暴露在没有任何CORS装饰,并且他们从任何来源工作正常。所以看起来这个设置有一些根本性的错误。

顺着这些线索,教程here(https://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask)似乎表明,瓶API应该自然无保护地暴露(我假设只是因为CORS扩展尚未应用),但我的应用程序基本上只是工作就像CORS扩展甚至不存在(除了日志中的几个注释,你可以看到)。

编辑2:

我的意见是不清楚的,所以我创建了三个例子端点上AWS API网关与不同CORS设置。他们是GET方法端点简单地返回 “成功”:

1)CORS未启用(默认):

端点:https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-default

响应:

的XMLHttpRequest不能加载 https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-default。 对预检请求的响应未通过访问控制检查:否 请求的 资源上存在“访问控制 - 允许来源”标头。 'http://127.0.0.1:5000'因此不允许 访问。响应有HTTP状态代码403

2)CORS启用 - 产地限制:

访问控制允许报头: '内容类型'

访问控制 - 允许-产地: 'http://example.com'

端点:https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-enabled-example

响应:

的XMLHttpRequest不能加载 https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-enabled-example。 对预检请求的响应未通过访问控制检查: '访问控制允许来源'标头的值'http://example.com' 不等于提供的原点。因此不允许访问原产地 'http://127.0.0.1:5000'。

3)CORS启用 - 产地通配符:

访问控制允许信头: 'Content-Type的' 访问控制允许来源: '*' 终点:https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-enabled-wildcard

响应:

"success"

我对基础设施没有经验,但我的期望是启用Flask CORS扩展会导致我的api端点模仿这种行为,这取决于我在origins=设置中设置的内容。我在这个Flask设置中缺少什么?

解决方案编辑:

好了,因为在我结束一些明显不正常,我剥了下来我的应用程序,并重新实现一些非常基本的API CORS产地限制的每个变化。我一直使用AWS的弹性beanstalk来托管测试环境,所以我重新上传了这些示例,并向每个请求发送了一个JS ajax请求。它正在工作。

我在裸露的终端上遇到了Access-Control-Allow-Origin错误。看起来,当我配置应用程序进行部署时,我取消了注释CORS(application, resources=r'/api/*'),这明显允许所有裸体终端的源代码!

我不知道为什么我的路线有特定的限制(origins=[])也允许一切,但这肯定是某种类型的打字错误或小事,因为它现在正在工作。

特别感谢sideshowbarker的所有帮助!

来源

2017-08-07 Feedslant

+0

对不起,我还不清楚你的期望。编辑2中的所有情况在我看来都像预期的那样工作。案例#1是你会考虑按预期工作的,对吧?在那一个中​​,你没有为该端点启用CORS,所以浏览器不允许访问该响应。就CORS协议而言,第二种情况也是按照预期的方式工作,因为您已将允许的来源设置为“http:// example.com”,但您从“http://127.0.0.1”发送请求:5000',所以浏览器不会让你的代码在'http://127.0.0。1:5000'参见响应 – sideshowbarker

+0

就CORS协议而言,情况#3也按预期工作 - 因为根据您所说的配置,“允许任何来源运行的前端代码访问来自该端点的响应”,所以在您发送请求的源中运行的代码成功访问响应。 – sideshowbarker

+0

我不明白是什么*“导致我的API端点模仿这种行为,这取决于我在'origins ='设置中设置的内容”*意味着 – sideshowbarker



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3