为何`来自。导入视图`可以解决Flask中的圆导入问题?

时间:2016-05-09 09:21:55

标签: python flask

我从Larger Applications学习。在本文档中,它说:“所有视图函数(顶部带有route()装饰器的函数)必须在 init 中导入.py文件。不是对象本身,而是它所在的模块。
我不知道为什么要这样做:from . import views,它成功了。虽然from views import *也能很好地工作。
我像这样组织这些文件:

myapplication/
  runner.py
  myflask/
    __init__.py
    views.py
    templates/
    static/
    ...

runner.py:

from testFlask import app
app.run()

myflask / __ INIT __ PY:

from flask import Flask
app = Flask(__name__)
from . import views # why this can work????

myflask / views.py:

from . import app
@app.route('/')
def index():
    return 'Hello World!'

我运行它:

$ cd myapplication
$ python runner.py

运行此Flask应用程序是可以的。但是我想知道为什么from . import views可以解决烧瓶中的圆圈导入问题?为什么文档说:不是对象本身,而是它所在的模块 ????

然而,当我喜欢这样的时候:

#some_dir/
#  application.py
#  views.py

#application.py
from flask import Flask
app = Flask(__name__)
import views # it doesn't work
# from views import * # it works
app.run()

#views.py
from application import app
@app.route('/')
def index():
    return 'Hello World!'

#run it
$ python application.py

它不起作用。

3 个答案:

答案 0 :(得分:0)

这是一个循环导入。但在您的情况下,可能已经存在问题的变量(app)已经在导入的脚本中定义,因此导入只会导致第一个" app"要被导入的" app"覆盖的实例实例。这没有实际效果。

有关此循环导入情况的详细信息,请阅读此post

如果您想要遵循大型烧瓶应用的模式,您应该查看blueprintsapplication factories

答案 1 :(得分:0)

这不是解决问题的具体命令,而是命令的顺序。

诀窍是您在主脚本中创建app变量后导入之后的视图,因此当视图脚本导入主脚本时,变量已经定义。

如果您尝试导入上面的视图来声明app变量,那么它将无效,因为它会导致导入循环而无法找到app变量。

答案 2 :(得分:0)

您的项目结构定义了导入最适合的方式。

这是"一个更大类型的应用程序"您可以使用蓝图定义视图,模板,静态文件和可应用于应用程序的其他元素的集合:

https://github.com/pallets/flask-website/tree/master/flask_website

亲切的问候