【问题标题】:Flask API deployed with Heroku 'CORS blocked' error使用 Heroku 的“CORS 被阻止”错误部署的 Flask API
【发布时间】:2019-12-25 06:23:21
【问题描述】:

我在部署到 Heroku 的应用程序上遇到问题。我在localhost上开发的时候没有出现这个错误,但是一部署就自发抛出这个错误:

Access to fetch at 
'https://frontend.herokuapp.com' from origin 
'https://backend.herokuapp.com' has been blocked 
by CORS policy: No 'Access-Control-Allow-Origin' header is present 
on the requested resource. If an opaque response serves your needs, 
set the request's mode to 'no-cors' to fetch the resource with CORS 
disabled.

我的 Flask 服务器的简化版:

from flask import Flask, request, make_response, jsonify, url_for, 
redirect, render_template
from flask_cors import CORS, cross_origin
import flask
import json

app = Flask(__name__)
CORS(app)

@app.route('/api/action', methods=['GET', 'POST'])
@cross_origin()
def prescription(response={}):

    # POST request
    if request.method == 'POST':
         print('score POST request')
         response = request.get_json()
         data = json.loads(response.get('data'))
         rating = a_super_cool_feature
         return jsonify(rating), 200

     # GET request
    else:
        print('GET request')
        return getScore(response)

@app.route('/api/score', methods=['GET', 'POST'])
@cross_origin()
def scoreHandler(response={}):

    # POST request
    if request.method == 'POST':
         print('Incoming..')
        response = request.get_json()
        parseResponse(response)
        return str(getScore(response)), 200


    # GET request
    else:
        return getScore(response)


@app.route('/test')
def test_page():
    # look inside `templates` and serve `index.html`
    return render_template('index.html')

if __name__ == "__main__":
     app.debug=True
     app.run()

我的前端是一个 React 应用程序。这两个服务器在不同的 Heroku 服务器上运行,我使用的是免费版本,所以我一次只能得到一个测功机(以防这可能导致此错误)。

有趣的是:

大约有一半的时间,当在部署的 Heroku 应用程序上调用这些 POST 请求时,会抛出错误。否则,它的工作没有问题。有关解决此问题的任何想法?

【问题讨论】:

标签: reactjs heroku flask cors flask-cors


【解决方案1】:

真的很奇怪的伪修复。基本上,在我向 Flask 后端发出 POST 请求的 40% 的时间里,它给了我这个错误,然后我添加了

 app.config['CORS_HEADERS'] = 'Content-Type'

下:

app = Flask(__name__)
CORS(app)

这并没有完全解决问题。然而;现在这个错误只有大约 5% 的时间在向后端发出请求时抛出。请参阅其他答案以获取实际修复。

【讨论】:

  • 百分比是什么意思?你是从 localhost 还是像邮递员这样的客户端制作它,默认情况下它可以工作,但不能用于生产应用程序。
  • 在邮递员中有效。这就是我对百分比的意思:我将部署应用程序,单击应用程序中发送 POST 请求的按钮,在检查元素中查看控制台,大多数情况下它工作得很好。但是,当我刷新页面并再次单击按钮时,大约 5% 的时间我会这样做,控制台给了我“No Access-Control-Allow-Origin”标题错误。
【解决方案2】:

好的,现在我确实修复了它。我在 Heroku 中购买了“爱好”测功机类型,现在我再也没有收到错误。我认为这与我发出请求时另一台服务器未启动并运行有关,因为我一次只能使用免费版本运行一个测功机。因此它以某种方式超时并给出了该错误。

使用 Hobby dyno 类型时,我的后端始终在运行,因此当我发出请求时,它不再超时并给出错误。

【讨论】:

    【解决方案3】:

    您可以使用这个 sn-p 在应用范围内启用 cors。

    from flask import Flask
    from flask_cors import CORS
    app = Flask(__name__) CORS(app)
    

    【讨论】:

    • 我在顶部有那个。我试过用它在应用程序范围内注释掉“@cross_origin()”,它有同样的错误。
    • 您在创建请求时是否设置了跨域标头?
    • React Fetch 中的含义?问题可能出在 React 前端的获取方式上吗?
    • 谁在阻止请求?客户端/浏览器?如果是,则在发送请求之前设置跨域标头。也许它甚至永远不会进入后端。
    • 非常感谢您的帮助!!!!在将 POST 请求从 React 发送到 Flask 之前,如何设置跨域标头?
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 2019-12-08
    • 2022-06-30
    • 2020-10-27
    • 2020-06-14
    • 2020-08-16
    • 2013-06-20
    • 2021-10-17
    相关资源
    最近更新 更多