我为我的一些项目创建了一个 Flask 应用程序。
~/flasksvr
目录下有一个主app.py,文件夹结构看起来有点像这样:
flasksvr/
> __init__.py (empty)
> app.py (main app)
> modules/ (subprojects)
> > __init__.py (empty)
> > subproj1.py
> > subproj2.py
> > subproj3.py
当我运行 app.py 时,它会导入所有带有 URL 前缀的子项目,如下所示:
from .modules.subproj1 import app as sp1app
from .modules.subproj2 import app as sp2app
from .modules.subproj3 import app as sp3app
app.register_blueprint(sp1app, url_prefix='/sp1')
app.register_blueprint(sp2app, url_prefix='/sp2')
app.register_blueprint(sp3app, url_prefix='/sp3')
无论如何,用
flask run -h 0.0.0.0 --debug
运行它效果很好,但是当我用 gunicorn app:app -b 0.0.0.0
运行它时,它给了我错误
from .modules.subproj1 import app as sp1app
ImportError: attempted relative import with no known parent package
我尝试将
from .modules.subproj1 import app as sp1app
部分更改为 from modules.subproj1 import app as sp1app
,并且成功了。但是在我的子项目1中,我正在导入一个带有from ..app import sock
的SocketIO应用程序(其中sock
是app.py中的sock = SocketIO(app, ping_interval=10)
)。然后 that 给了我错误 ImportError: Attempted relative import with no known parent package
。为什么会发生这种情况?为什么它可以与普通 Flask 一起使用,但不能与 Gunicorn 一起使用?在 Debian 11 上使用 Python 3.9。
具有文件夹结构
flasksvr/
> __init__.py
> app.py <----- path is here
> modules/
> > __init__.py
> > subproj1.py <----- in this file subproj1.py is `from app import sock` because your root path now at app.py
> > subproj2.py
> > subproj3.py
当你在gunicorn中运行项目时,Gunicorn会将所有资源加载到worker中,根路径位于app.py
gunicorn app:app
。这与默认运行flask run不同,调用时会导入
如果你想同时运行flask run和gunicorn。您可以使用:
flasksvr/
> app.py <------ from modules.subproj1 import app as sp1app
> modules/
> > subproj1.py <------ from app import sock
> > subproj2.py
> > subproj3.py