Flask与gunicorn,多模块:循环导入 - 并非所有路由可访问

3 投票
2 回答
1636 浏览
提问于 2025-04-18 01:45

我的问题和Flask和Gunicorn在Heroku上的导入错误以及Procfile自定义模块名称有点类似,但我用他们的解决方案还是没法解决我的问题。

我的Flask应用程序结构如下:

appname/
   run.py
   Procfile
   venv/
       ...
   appname/
       app.py
       views.py

run.py:

from appname import app
app.run(debug=True)

app.py:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return "here"

Procfile:

web: gunicorn --pythonpath appname app:app

views.py:

from appname import app
from flask import render_template

@app.route('/there')
def there():
    return "there"

之前,我在运行foreman start时遇到了一些错误,但当我从app.py中删除import appname.views后,这些错误就消失了。

现在,foreman start可以正常运行应用程序,根路径/可以访问,但/there却无法访问。这是为什么呢?

2 个回答

1

我找到了一些方法来绕过这个问题,具体做法是:

  1. 除了在 run.py 文件里,其他地方都不使用 from appname import app
  2. 因此,只在 app.py 文件里定义路由

我其实更希望把我的路由和模块放在一起,不过我不太确定哪种写法在Python中更好。

4

太好了!我终于能用我想要的代码让它正常工作了。

应用结构(没有改变):

appname/
   run.py
   Procfile
   venv/
       ...
   appname/
       app.py
       views.py

run.py(没有改变):

from appname import app
app.run(debug=True)

app.py:

from flask import Flask
app = Flask(__name__)

import appname.views
import appname.anothermodule

Procfile:

web: gunicorn appname:app

views.py(没有改变):

from appname import app

@app.route('/')
def home():
    return "Hello, awesomeness!"

撰写回答