Python 为什么这个炼金术代码块执行两次?

Python 为什么这个炼金术代码块执行两次?,python,sqlite,flask,flask-sqlalchemy,Python,Sqlite,Flask,Flask Sqlalchemy,app.py的代码示例: # imports here app = Flask(__name__) app.config.from_pyfile('app.cfg') db.init_app(app) with app.app_context(): if os.path.exists('database/example.db'): print 'already exists' else: print 'database created'

app.py的代码示例:

# imports here

app = Flask(__name__)
app.config.from_pyfile('app.cfg')
db.init_app(app)
with app.app_context():
    if os.path.exists('database/example.db'):
        print 'already exists'
    else:
        print 'database created'
        db.create_all()


#routes here

if __name__ == '__main__':
    app.run()
在初始加载时,它将打印“数据库已创建”,然后打印“已存在”。如果在创建数据库后再次加载它,“已存在”将打印两次

already exists
 * Running on http://127.0.0.1:5000/
 * Restarting with reloader
already exists
问题分两部分:

1) 为什么app.app_context()块会执行两次


2) 编写此代码的更好方法是什么?

要了解发生了什么,请返回python基础知识。当您键入
python时,您的_module.py
python解释器将逐行读取(解释器)您的代码。在这种情况下,当它到达app.app_context时,它将使用app.app_context执行您的
,您将看到输出数据库第一次创建或下次已经存在。接下来会发生什么?解释器将继续执行您的
,如果
行中的
参数为
True
,它将在调试模式下启动开发服务器,自动重新加载程序将重新启动您的代码(如@burnpanck所述)。

要了解发生了什么,请回到python基础知识。键入
python时,python解释器将读取(解释器)你的代码一行接一行。在这种情况下,当它到达app.app\u context时,它将执行你的
,你将看到输出数据库第一次创建或下次已经存在。接下来会发生什么?解释器将继续执行你的
,如果uuu name\uuuu=''\uu main\uuu':
行,因为你直接运行它我将调用
app.run
方法,默认情况下
debug
参数为
True
,它将在调试模式下启动开发服务器,自动重新加载程序将重新启动代码(如@burnpanck所述).

要了解发生了什么,请返回python基础知识。键入
python时,您的_module.py
python解释器将读取(解释器)你的代码一行接一行。在这种情况下,当它到达app.app\u context时,它将执行你的
,你将看到输出数据库第一次创建或下次已经存在。接下来会发生什么?解释器将继续执行你的
,如果uuu name\uuuu=''\uu main\uuu':
行,因为你直接运行它我将调用
app.run
方法,默认情况下
debug
参数为
True
,它将在调试模式下启动开发服务器,自动重新加载程序将重新启动代码(如@burnpanck所述).

要了解发生了什么,请返回python基础知识。键入
python时,您的_module.py
python解释器将读取(解释器)你的代码一行接一行。在这种情况下,当它到达app.app\u context时,它将执行你的
,你将看到输出数据库第一次创建或下次已经存在。接下来会发生什么?解释器将继续执行你的
,如果uuu name\uuuu=''\uu main\uuu':
行,因为你直接运行它我将调用
app.run
方法,默认情况下
debug
参数为
True
,它将在调试模式下启动开发服务器,自动重新加载程序将重新启动代码(如@burnpanck所述)。但是,如果数据库已经存在,我真的看不到有什么变化,因此没有任何线索。正如输出所述,是自动代码重新加载程序重新启动代码。当应用程序运行时,它应该在代码发生变化时执行此操作,它仅在调试模式下启用(也许你应该显示你的
app.cfg
)。但是,如果数据库已经存在,我真的看不到有什么变化,因此没有任何线索。正如输出所述,是自动代码重新加载程序重新启动代码。当应用程序运行时,它应该在代码发生变化时执行此操作,它仅在调试模式下启用(也许你应该显示你的
app.cfg
)。但是,如果数据库已经存在,我真的看不到有什么变化,因此没有任何线索。正如输出所述,是自动代码重新加载程序重新启动代码。当应用程序运行时,它应该在代码发生变化时执行此操作,它仅在调试模式下启用(也许你应该显示你的
app.cfg
).但是,如果数据库已经存在,我真的看不到有什么变化,因此没有任何线索。