由 CherryPy 托管的 Flask 应用程序:OPTIONS 返回 404



我有一个使用 Flask 和 Flask-Restful 创建的 restful API。使用开发服务器一切正常。所有路由都在蓝图中,尽管我们在这里处理的特定路由不是 Flask-Restful 路由。这只是一条普通的烧瓶路线。

我也在使用Flask-CORS。

要部署,一切都是dockerized的,我使用CherryPy作为WSGI主机。因此,CherryPy应用程序在容器中托管Flask应用程序。 我正在使用 Traefik 作为另一个容器中的反向代理。

如果我通过在 Chrome 中粘贴网址来发出以下请求,则 GET 请求有效:

https://api.my-app.new/api/admin/user?_end=10&_order=DESC&_sort=id&_start=0

但是,如果我从 React 应用程序发出相同的 GET 请求,则会发出 OPTIONS 预检请求,并且它因 404 而失败。 我已经在 PyCharm 中尽我所能地追踪了它,问题似乎出在 Flask app.py 中的以下代码中:

def preprocess_request(self):
bp = _request_ctx_stack.top.request.blueprint

基本上,找不到蓝图。

实际发送的内容在此卷曲调用中看到:

curl 'https://api.my-app.new/api/admin/user?_end=10&_order=DESC&_sort=id&_start=0' 
-X OPTIONS -H 'access-control-request-method: GET' -H 'origin: https://admin.my-app.new' 
-H 'accept-encoding: gzip, deflate, br' -H 'accept-language: en-US,en;q=0.9' 
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' 
-H 'accept: */*' -H 'referer: https://admin.my-app.new/' -H 'authority: api.my-app.new' 
-H 'access-control-request-headers: authorization,content-type' --compressed

如果我打印出 Flask-app 收到的标头(在 @app.before_request 中),我会得到以下内容:

[2018-01-25 04:31:48,438] INFO - X-Forwarded-Server: cb5d56692c6d
Referer: https://admin.my-app.new/
Accept-Language: en-US,en;q=0.9
Origin: https://admin.my-app.new
X-Real-Ip: 172.19.0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
Access-Control-Request-Headers: authorization,content-type
X-Forwarded-Proto: https
Host: api.my-app.new
Accept: */*
Access-Control-Request-Method: GET
X-Forwarded-Host: api.my-app.new
X-Forwarded-For: 172.19.0.1
X-Forwarded-Port: 443
Accept-Encoding: gzip, deflate, br
[2018-01-25 04:31:48,440] INFO - Error 404:/api/admin/user?_end=10&_order=DESC&_sort=id&_start=0: 404 Not Found: The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again. ("/app/app/routes.py:87")

现在,如果我在没有 traefik 反向代理的情况下运行的应用程序发出相同的请求,它可以工作。卷曲中唯一不同的东西 请求是我使用的是http,而不是https。

以下是在这种情况下 Flask 收到的标头:

[2018-01-24 21:43:43,199] INFO - Referer: https://admin.my-app.new/
Origin: https://admin.my-app.new
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
Authority: api.my-app.new
Access-Control-Request-Headers: authorization,content-type
Host: api.my-app.new:8000
Accept: */*
Access-Control-Request-Method: GET
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate, br
[24/Jan/2018 21:43:43] "OPTIONS /api/admin/user?_end=10&_order=DESC&_sort=id&_start=0 HTTP/1.1" 200 -

我认为标题有问题或使 Flask 感到困惑。我看到2014年的另一篇帖子提到需要SERVER_NAME,但这并没有帮助。

最后,我最初使用 NGinx 作为备用代理,并且一切正常。其中一件事 使用NGinx很难获得的是重定向和选项请求。在疯狂地追逐各种博客后,我确实让它工作了 帖子,但是当我回顾它时,我注意到一件奇怪的事情:我最终在nginx.conf中编写脚本 为所有选项请求自动返回 200!

知道为什么选项请求失败吗?

正如webKnjaZ所指出的:"这是一个错误。

深入挖掘后,我发现 Flask 为 GET 请求获取的 URL 与 OPTIONS 请求的 URL 不同,并且如果删除 CherryPy,问题就会消失。这导致我遇到了这个CherryPy问题,它准确地描述了我的情况。

https://github.com/cherrypy/cherrypy/issues/1662

作者指出,从 CherryPy 11 移动到 12(我在 13.x 上)时出现了该错误,所以我尝试降级到 11.0.0 并修复了它。

相关内容

  • 没有找到相关文章

最新更新