Python Flask CORS |
您所在的位置:网站首页 › flask如何部署 › Python Flask CORS |
我已经浏览了许多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 |