我在使用 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
