这些天我正在学习 Flask。
一开始,我把整个代码写在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()
Run Code Online (Sandbox Code Playgroud)
和 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()
Run Code Online (Sandbox Code Playgroud)
结果显示@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 ###
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
如果您main.py从命令行作为主入口脚本运行,那么模块的整个命名空间都存储在__main__模块中,而不是main模块中。这也是if __name__ == '__main__'测试成功的原因。
但是,您的frontend/helpers.py模块从 导入main,就 Python 而言,它是一个不同的模块。您现在创建了两个不同的Flask实例,每个实例都位于不同的模块命名空间中。
换句话说,__main__.app正在用于运行您的 Flask 服务器,但您的before_request钩子已注册到不同的单独 main.app对象。
不要使用相同的模块作为脚本运行并创建FlaskWSGI 对象。为此使用单独的模块。不要尝试使用from __main__ import app,因为当您部署到 WSGI 容器(如gunicorn或 )时,这会中断mod_wsgi。
| 归档时间: |
|
| 查看次数: |
1996 次 |
| 最近记录: |