Skip to main content
 首页 » 编程设计

python之Flask 在导入的模块中找不到路由

2025年05月04日36jirigala

我在使用 Flask 时遇到问题,其中在导入的模块中声明的路由未被注册并且总是导致 404。我在 Python 2.7 上运行最新版本的 Flask。

我有以下目录结构: run.py 有以下代码: 从 flask 导入 flask

app = Flask(__name__) 
 
 
@app.route('/') 
def hello_world(): 
    return 'Hello World!' 
 
import views.home 
 
if __name__ == '__main__': 
    app.run() 

home.py 的代码如下:

from run import app 
 
 
@app.route('/test') 
def test(): 
    return "test" 

当我运行 run.py 时,在 home.py ( http://localhost:5000/test ) 中声明的路由总是返回 404,即使 run.py 导入 views.home。在 run.py 中声明的 Root View ( http://localhost:5000) 工作正常。

我写了一个打印所有注册路由的函数,但/test 不在其中 ( get a list of all routes defined in the app )。

知道为什么吗?

请您参考如下方法:

我发现将 run.py 中的 import 语句从

import views.home 

到

from views.home import * 

一切正常,这让我明白了为什么没有使用 import views.home 注册模块。

基本上,当 run.py 作为脚本运行时,它被赋予名称 __main__ 并且这是在 sys.modules 中赋予模块的名称 ( Importing modules: __main__ vs import as module )

然后,当我从 views.home.py 中的 run.py 导入应用程序时,一个新的 run.py 实例会在 中注册code>sys.modules 名称为 run。此时,run.py 和 views.home.py 中对 app 的引用是两个不同的引用,因此未注册路由。

解决方案是将 app 变量的创建从 run.py 移到一个单独的 python 文件中(我称之为 web_app.py ) 导入到 run.py 中。这保证了在 web_app.py 中声明的 Flask app 变量总是在导入 web_app.py 的地方被正确引用。

所以 run.py 现在看起来像这样:

from web_app import app 
 
if __name__ == '__main__': 
    app.run() 

和 web_app.py 看起来像这样:

from flask import Flask 
 
app = Flask(__name__) 
 
import view.home