flask - 400 响应 CORS 预检
问题描述
我在 swagger.mydomain.com 上运行 swagger (docker: swaggerapi/swagger-ui),并为在 a.mydomain.com 和 b.mydomain.com 上运行的 api 服务器定义了两个定义
a 和 b 都是烧瓶(python)服务器。由于在第四个子域上提供 web 应用程序,a.mydomain.com 现在已经设置了一段时间的 CORS。这在该子域以及 swagger 中都可以正常工作。现在我为 b.mydomain.com 做了同样的 CORS 设置,但是没有成功。
两台服务器上的设置如下所示:
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app, origins=r"^.*(mydomain\.com)")
正如我所说,这适用于 a.mydomain.com,但不适用于 b.mydomain.com。
Preflight 看起来相同,除了 url、状态代码(分别为 200 和 400)以及工作请求有一个额外的allow: POST, OPTIONS
标头。我没有看到任何代码差异来证明这个额外的标题是合理的。
失败的预检请求需要 150 毫秒,是工作请求的两倍。
通过 swagger 执行请求会提供 curl 请求。在本地执行此操作会给出预期的输出,因此请求通常是正确的。
我不知道还能尝试什么。据我所知,a 和 b.mydomain.com 的设置完全相同。这里有什么问题?
解决方案
400 是一个非常不寻常的预检响应代码。这表明端点可能被配置为期望请求中的特定请求正文/有效负载或标头,而不管请求的 HTTP 方法是什么。但是由于对于预检OPTIONS
请求,浏览器没有发送请求正文和附加标头,服务器代码没有收到它所期望的。
对于这种情况,解决方法是确保OPTIONS
为该路由/端点配置的请求有一个特定的、单独的处理程序。
推荐阅读
- jquery - chart.js 显示日期 1 年
- apache-spark - 火花过滤器的操作顺序为 O(1) 或 O(n)
- ios - 使用 JSONEncoder.encode() 时的 EXC_BAD_ACCESS (code=2)
- html - 调整 ng-lazyload-image 的大小
- python - 在与多处理同时运行的两个 python 进程之间共享图像和数据
- java - AWS Java SDK PKIX 路径构建失败
- javascript - slideUp 和 slideDown 动画在第一次使用后不起作用
- graphql - 解释在 Apollo 客户端调用 mutate 的语法
- dart - Process.run():没有这样的文件或目录
- matlab - 如何在 uitable (GUI) 中定义选择列表的每个案例并为每个案例添加 IF 函数?