Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在gunicorn上运行Flask应用程序时,当我设置app.wsgi_app=ProxyFix(app.wsgi_app)时发生了什么?_Python_Flask_Wsgi_Gunicorn_Werkzeug - Fatal编程技术网

Python 在gunicorn上运行Flask应用程序时,当我设置app.wsgi_app=ProxyFix(app.wsgi_app)时发生了什么?

Python 在gunicorn上运行Flask应用程序时,当我设置app.wsgi_app=ProxyFix(app.wsgi_app)时发生了什么?,python,flask,wsgi,gunicorn,werkzeug,Python,Flask,Wsgi,Gunicorn,Werkzeug,我使用Flask构建了一个基本的web应用程序,并能够使用其本机http服务器在虚拟机上运行它。我很快意识到,通过这种设置,请求会被阻塞(我无法同时请求资源;任何新请求都会等到以前的请求完成),于是决定尝试gunicorn运行应用程序来解决这个问题。我遵循了以下原则,特别是这一行: gunicorn -w 4 -b 127.0.0.1:4000 myproject:app 然而,它并没有做到这一点,并抱怨并没有WSGI应用程序。翻遍互联网,我发现很多人都发布了如下示例: from werkz

我使用Flask构建了一个基本的web应用程序,并能够使用其本机http服务器在虚拟机上运行它。我很快意识到,通过这种设置,请求会被阻塞(我无法同时请求资源;任何新请求都会等到以前的请求完成),于是决定尝试gunicorn运行应用程序来解决这个问题。我遵循了以下原则,特别是这一行:

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app 
然而,它并没有做到这一点,并抱怨并没有WSGI应用程序。翻遍互联网,我发现很多人都发布了如下示例:

from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)
我补充说,它解决了我的问题。但我感到困惑,因为这显然是为了解决HTTP代理背后的服务问题,但gunicorn的添加会强制使用HTTP代理吗?或者我总是在一个代理后面,而这对Flask的内置服务器并不重要


此外,警告“出于安全原因,请勿在非代理设置中使用此中间件”。考虑到修复显然是必要的,我可以假设我正在进行代理设置吗?

您需要显示定义Flask应用程序“app”的代码

“应用程序”的定义在哪里?您是从另一个文件导入它吗

以下是我试图重现的问题:

$ cat myproject.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "ok"

$ bin/gunicorn -w 4 -b 127.0.0.1:4000 myproject:app &
[1] 27435

2014-03-04 12:18:36 [27435] [INFO] Starting gunicorn 18.0
2014-03-04 12:18:36 [27435] [INFO] Listening at: http://127.0.0.1:4000 (27435)
2014-03-04 12:18:36 [27435] [INFO] Using worker: sync
2014-03-04 12:18:36 [27441] [INFO] Booting worker with pid: 27441
2014-03-04 12:18:36 [27442] [INFO] Booting worker with pid: 27442
2014-03-04 12:18:36 [27445] [INFO] Booting worker with pid: 27445
2014-03-04 12:18:36 [27448] [INFO] Booting worker with pid: 27448

$ curl http://127.0.0.1:4000/
ok

正如你所看到的,它工作得很好。在这种情况下,您肯定不需要ProxyFix。

参加聚会有点晚,但文档中是这样描述ProxyFix的

换言之:在HTTP代理之后使用gunicorn部署服务器,您需要重写一些头文件,以便应用程序能够工作。
Werkzeug附带了一个修复程序,可以解决一些常见的设置。

+1-好问题。问你一个问题-这两条线是你重新部署前唯一改变的东西吗?是的。我先尝试了一些其他方法,但当其他方法无法解决问题时,我删除了所有与之相关的方法。您是否从Gunicorn收到任何错误消息?ProxyFix只是更改一些环境变量,以便通过代理获得正确的详细信息。还有,你使用的是什么版本的Flask和Werkzeug?我很惊讶gunicorn在没有它的情况下无法启动。此修复程序应该解决的唯一问题与反向代理有关,例如,当您获得127.0.0.1作为客户端地址时,因为对gunicorn的请求来自nginx。如果您对修复程序的实际功能感兴趣,我认为源代码已经足够清楚了:您可能应该检查gunicorn日志文件,看看是否有更详细的错误消息。此外,如果在某种配置文件中使用模块路径指向wsgi_应用程序对象,则应确保在模块中有对wsgi_应用程序作为顶级对象的引用。在您的示例中,wsgi_应用程序似乎是模块中某个其他对象上的属性,这可能不允许通过模块路径访问它,即“my_project.wsgi_module.app.wsgi_app”可能不起作用,但“my_project.wsgi_module.app”会起作用。可能不是问题,但值得一看。