gpt4 book ai didi

python - Flask app.before_request 移动到其他模块时不起作用

转载 作者:行者123 更新时间:2023-11-30 23:06:04 24 4
gpt4 key购买 nike

这几天我在学习 Flask。

一开始,我在main.py中编写了整个代码,并随着代码的增加开始拆分代码。

一切都很好。但是 @app.before_requestmain.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()

结果显示frontend/helpers.py中的@app.before_request没有被调用。

127.0.0.1 - - [30/Sep/2015 15:55:35] "GET /login HTTP/1.1" 200 -
### called in main ###

我怎样才能做到这一点才能很好地工作?

最佳答案

如果您从命令行运行 main.py 作为主入口脚本,则模块的整个命名空间存储在 __main__ 模块中,而不是模块。这也是 if __name__ == '__main__' 测试成功的原因。

但是,您的 frontend/helpers.py 模块从 main 导入,就 Python 而言,这是一个不同的模块。您现在创建了两个不同的 Flask 实例,每个实例都位于不同的模块命名空间中。

换句话说,__main__.app 用于运行 Flask 服务器,但您的 before_request 钩子(Hook)注册到不同的、单独的 main.app 对象。

不要使用相同的模块作为脚本运行并创建 Flask WSGI 对象。为此使用单独的模块。不要尝试使用 from __main__ import app ,因为当您部署到 gunicornmod_wsgi 等 WSGI 容器时,这会中断。

关于python - Flask app.before_request 移动到其他模块时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32860386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com