这些天我正在学习烧瓶。
起初,我在main.py
中编写了整个代码,并在代码增加时开始分割代码。
一切都很好。但@app.before_request
在main.py
中运行良好,但在将此代码移到单独的模块后停止工作。
我花了很多时间来理解这个原因,但即便想象。 :(
main.py
就在这里
app = Flask(__name__)
app.config.from_object(settings)
db = SQLAlchemy()
@app.before_request
def working():
from user.models import User
print '### called in main ###'
g.user = User.get_by_session()
if __name__ == '__main__':
db.init_app(app)
app.register_blueprint(frontend.views.blueprint)
app.register_blueprint(user.views.blueprint)
import frontend.helpers
app.run()
和frontend/helpers.py
from flask import g
from main import app
from user.models import User
@app.before_request
def not_working():
print '### called in frontend.helpers ###'
g.user = User.get_by_session()
结果显示@app.before_request
中的frontend/helpers.py
未被调用。
127.0.0.1 - - [30/Sep/2015 15:55:35] "GET /login HTTP/1.1" 200 -
### called in main ###
如何才能做到这一点?
答案 0 :(得分:3)
如果从命令行运行main.py
作为主条目脚本,则模块的整个命名空间存储在__main__
模块中,而不是main
模块中。这也是if __name__ == '__main__'
测试成功的原因。
但是,您的frontend/helpers.py
模块从main
导入,就Python而言,它是一个不同的模块。您现在创建了两个不同的Flask
实例,每个实例都位于不同的模块命名空间中。
换句话说,__main__.app
用于运行Flask服务器,但您的before_request
挂钩已注册一个不同的 main.app
对象。
不要使用相同的模块作为脚本运行并创建Flask
WSGI对象。为此使用单独的模块。当您部署到from __main__ import app
或gunicorn
等WSGI容器时,不要尝试使用mod_wsgi
,因为它会中断。