gunicorn:无法在模块中找到属性 'app'

gunicorn: Failed to find attribute 'app' in module

嗨,我正在尝试 运行,

gunicorn --bind localhost:8000 --worker-class sanic_gunicorn.Worker module:app

我有以下文件

# ls
build                            
setup.py
dist                             
module         
module.egg-info 
venv

#cd module

#ls
__init__.py
__pycache__
__main__.py
app.py

__main__.py内容如下

from module.app import create_app_instance


if __name__ == '__main__':
    app = create_app_instance()
    app.run()

app.py的内容是

#some imports

def create_app_instance():
    app = Sanic(name = "app_name")
    .....
    return app

我正在使用 Sanic 网络框架,当我 运行 宁它是开发服务器时 python -m module 它工作正常

python3 -m module
[2021-06-16 22:31:36 -0700] [80176] [INFO] Goin' Fast @ http://127.0.0.1:8000
[2021-06-16 22:31:36 -0700] [80176] [INFO] Starting worker [80176]

谁能告诉我我做错了什么?

简单的答案是模块内部没有 app 暴露。您有 create_app_instance() 方法,但未调用此方法。

我建议您按如下方式重构代码。文件结构为:

./wsgi.py
./module/__init__.py

这些文件的内容如下:

.\wsgi.py

from module import create_app_instance


app = create_app_instance()


if __name__ == '__main__':
    app.run()

.\module\__init__.py

# this is the contents of your current app.py
#some imports

def create_app_instance():
    app = Sanic(name = "app_name")
    .....
    return app

然后启动服务器的 gunicorn 行将是(请注意下面 的评论):

gunicorn --bind localhost:8000 --worker-class sanic_gunicorn.Worker wsgi:app

它的作用是调用 wsgi.py 中公开的 app 实例。不需要 __main__.py,您的 app.py 中的代码已移至 __init__.py

我强烈建议您通读 documentation/tutorials for Application Factory Pattern for Flask。原理本身和Sanic一样,但是Flask原理的文章比较多...