我从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
它不起作用。
答案 0 :(得分:0)
这是一个循环导入。但在您的情况下,可能已经存在问题的变量(app)已经在导入的脚本中定义,因此导入只会导致第一个" app"要被导入的" app"覆盖的实例实例。这没有实际效果。
有关此循环导入情况的详细信息,请阅读此post。
如果您想要遵循大型烧瓶应用的模式,您应该查看blueprints和application factories。
答案 1 :(得分:0)
这不是解决问题的具体命令,而是命令的顺序。
诀窍是您在主脚本中创建app
变量后导入之后的视图,因此当视图脚本导入主脚本时,变量已经定义。
如果您尝试导入上面的视图来声明app变量,那么它将无效,因为它会导致导入循环而无法找到app变量。
答案 2 :(得分:0)
您的项目结构定义了导入最适合的方式。
这是"一个更大类型的应用程序"您可以使用蓝图定义视图,模板,静态文件和可应用于应用程序的其他元素的集合:
https://github.com/pallets/flask-website/tree/master/flask_website
亲切的问候