问题可以分为两个部分。
我有以下项目结构
|- project
| |-- app/ - directory with actual project code
| |-- app.py - imports something from app/ and call create_app
当我运行gunicorn
时,我应该将他指向app
实际在app.py
中创建的对象。所以我收到错误,因为gunicorn将app:app
视为一个包。唯一的方法是重命名?
我使用工厂方法创建应用。因此,我在app.py中导入create_app
功能并将其从Manager
传递给flask.ext.script
。我将经理对象传给了gunicorn。在这种情况下,gunicorn运行正常,但一旦第一个请求到来,我得到以下错误:
[2015-03-25 15:38:11 +0000] [14395] [ERROR] Error handling request
Traceback (most recent call last):
File "/opt/env/local/lib/python2.7/site-packages/gunicorn/workers/async.py", line 52, in handle
self.handle_request(listener_name, req, client, addr)
File "/opt/env/local/lib/python2.7/site-packages/gunicorn/workers/ggevent.py", line 159, in handle_request
super(GeventWorker, self).handle_request(*args)
File "/opt/env/local/lib/python2.7/site-packages/gunicorn/workers/async.py", line 105, in handle_request
respiter = self.wsgi(environ, resp.start_response)
TypeError: __call__() takes at most 2 arguments (3 given)
也许我可以创建一些文件wsgi.py
并为gunicorn提供当前的应用程序?
答案 0 :(得分:3)
如果名为“app”的两个东西位于Python路径的同一目录中,则会出现问题。
您需要将Flask应用程序实例直接传递给gunicorn。命令行管理器不是WSGI应用程序,这就是您收到该错误的原因。
您只需在致电您的应用工厂时直接指向gunicorn,就不需要任何中间代码。
gunicorn app:create_app()