gpt4 book ai didi

python - Flask app_context 中的 current_app 错误

转载 作者:太空宇宙 更新时间:2023-11-03 15:55:59 28 4
gpt4 key购买 nike

我在我的 Flask 应用程序上看到了一个相当奇怪的行为:嵌套的 app_contexts 没有在我的测试套件上正常工作,因此 current_app localproxy 没有指向正确的应用程序。它是完全同步的代码,因此没有线程、协程或任何东西。

请问有人可以提供任何指导吗?

> /.../browsepy/tests/deprecated/test_plugins.py(173)test_register_plugin()
171 self.manager = self.manager_module.PluginManager(self.app)
172 with self.app.app_context():
--> 173 self.manager.load_plugin('player')
174 self.assertIn(self.player_module.player, self.app.blueprints.values())
175

ipdb> self.app
<Flask 'TestIntegration'>
ipdb> type(self.app)
<class 'flask.app.Flask'>
ipdb> d
> /.../browsepy/manager.py(151)load_plugin()
149 module = super(RegistrablePluginManager, self).load_plugin(plugin)
150 if hasattr(module, 'register_plugin'):
--> 151 module.register_plugin(self)
152 return module
153

ipdb> current_app
<Flask 'browsepy'>
ipdb> type(current_app)
<class 'werkzeug.local.LocalProxy'>

最佳答案

问题出在其他地方,pdb 与 Flask current_app 不能很好地配合。

编辑

我在没有快速失败选项的情况下运行测试套件,因此在注入(inject)事后调试器之前运行了其他测试。

无论如何,flask 的行为仍然存在很大问题:在使用 app.test_client 方法后,它不会清除其上下文全局变量,这就是我尝试调试的错误和我发现的调试问题的根源。

以下是我必须用来清理 Flask 上下文的函数,以防止 Flask 本身在测试中混合来自不同应用程序的内容:

import flask


def clear_localstack(stack):
'''
Clear given werkzeug LocalStack instance.

:param ctx: local stack instance
:type ctx: werkzeug.local.LocalStack
'''
while stack.pop():
pass


def clear_flask_context():
'''
Clear flask current_app and request globals.

When using :meth:`flask.Flask.test_client`, even as context manager,
the flask's globals :attr:`flask.current_app` and :attr:`flask.request`
are left dirty, so testing code relying on them will probably fail.

This function clean said globals, and should be called after testing
with :meth:`flask.Flask.test_client`.
'''
clear_localstack(flask._app_ctx_stack)
clear_localstack(flask._request_ctx_stack)

关于python - Flask app_context 中的 current_app 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40783792/

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