python Flask-CORS不适用于POST,但适用于GET

mrphzbgm  于 2023-06-28  发布在  Python
关注(0)|答案(4)|浏览(157)

我正在本地运行Flask-Restful API,并从不同的端口发送包含JSON的POST请求。我得到了错误

No 'Access-Control-Allow-Origin' header is present on the requested resource.

然而,当我跑步的时候

curl --include -X OPTIONS http://localhost:5000/api/comments/3
        --header Access-Control-Request-Method:POST
        --header Access-Control-Request-Headers:Content-Type
        --header Origin:http://localhost:8080

我明白

HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Allow: HEAD, GET, POST, OPTIONS
Access-Control-Allow-Origin: http://localhost:8080
Access-Control-Allow-Methods: DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT
Vary: Origin
Access-Control-Allow-Headers: Content-Type
Content-Length: 0

其将“Access-Control-Allow-Origin”显示为“*”。GET工作正常,只是POST给出了这个错误。会出什么问题呢?如果相关的话,对于前端,我使用react和通过axios请求。

3yhwsihp

3yhwsihp1#

在我的例子中,由于内部错误而引发了CORS错误。一个与CORS完全无关的错误导致了这个问题,它应该返回500。

ippsafx7

ippsafx72#

您必须将CORS(app, resources={r"/*": {"origins": "*"}})添加到flask应用程序中。
希望这能解决问题。

daupos2t

daupos2t3#

Flask-Cors文档解释了为什么会发生这种情况
当使用JSON跨源时,浏览器将为POST请求发出pre-flight OPTIONS请求。为了让浏览器允许带有JSON内容类型的POST请求,您必须允许Content-Type头。最简单的方法是在应用程序上设置CORS_HEADERS配置值:例如”
https://flask-cors.readthedocs.io/en/1.9.0/

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

mepcadol4#

在Post请求浏览器中,在执行post之前发送一个OPTIONS请求作为pre-flight请求,因此在服务器上启用带有正确CORS头的OPTIONS请求将解决此问题。
CORS(跨域资源共享)错误发生在浏览器中运行的Web应用程序试图向与加载它的域不同的域(源)发出请求时。CORS是一种在Web浏览器中实现的安全机制,出于安全原因,默认情况下可以防止跨域请求。CORS错误背后的基本逻辑如下:
1.当在浏览器中运行的Web应用程序向不同的域发出请求时,浏览器会自动发送一个称为“preflight”请求的HTTP请求,以检查是否允许跨域请求。预检请求为OPTIONS类型。
1.接收预检请求的服务器必须使用适当的CORS报头进行响应,以指示允许跨域请求。
1.如果服务器没有使用必要的CORS标头进行响应,或者使用不正确的标头进行响应,浏览器会阻止实际的请求并抛出CORS错误。
服务器应在其响应中包含的CORS标头为:
1.Access-Control-Allow-Origin:指定跨域请求允许的源。它可以是一个特定的域或'*',以允许来自任何来源的请求。
1.Access-Control-Allow-Methods:指定跨域请求允许的HTTP方法,如GET、POST、PUT、DELETE等。
1.Access-Control-Allow-Headers:指定跨域请求允许的标头,如Content-Type、Authorization等。
1.Access-Control-Allow-Credentials:可选标头,指示浏览器是否应在跨域请求中包含凭据(例如,cookie、HTTP身份验证)。
我在flask应用程序中使用azure函数httpTrigger来运行httppost请求。所以允许在function.json文件中请求选项为我解决了这个问题。
“methods”:[“get”,“post”,“options”]

相关问题