Flask无法在导入的模块中查找路径

use*_*836 1 python flask python-2.7

我遇到了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()
Run Code Online (Sandbox Code Playgroud)

home.py具有以下代码:

from run import app


@app.route('/test')
def test():
    return "test"
Run Code Online (Sandbox Code Playgroud)

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

我编写了一个函数,打印出所有已注册的路由和/ test不在那里(获取应用程序中定义的所有路由的列表).

知道为什么吗?

use*_*836 5

我发现run.py从中切换import语句

import views.home
Run Code Online (Sandbox Code Playgroud)

from views.home import *
Run Code Online (Sandbox Code Playgroud)

使一切工作,这给了我关于为什么模块没有注册使用的线索import views.home.

基本上,当run.py作为脚本运行时,它被赋予名称__main__,这是给模块的名称sys.modules(导入模块:__ main__ vs import as module)

然后,当我输入的应用程式run.pyviews.home.py的一个新实例run.py被注册sys.modules的名称run.由于这一点上,参照apprun.pyviews.home.py是两个不同的引用不因此被注册的路由.

解决方案是将app变量的创建移出run.pyweb_app.py导入到导入的单独python文件(我称之为)中run.py.这保证了app内部声明的Flask 变量web_app.pyweb_app.py导入的任何地方都始终正确引用.

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

from web_app import app

if __name__ == '__main__':
    app.run()
Run Code Online (Sandbox Code Playgroud)

并且web_app.py看起来是这样的:

from flask import Flask

app = Flask(__name__)

import view.home
Run Code Online (Sandbox Code Playgroud)