使用 Shell¶
更新日志
在版本 0.3 中添加。
人们喜爱 Python 的原因之一是交互式 shell。它基本上允许你实时执行 Python 命令并立即获得结果。Flask 本身不自带交互式 shell,因为它不需要任何预先设置,只需导入你的应用程序并开始使用即可。
然而,有一些方便的助手可以使在 shell 中操作的体验更加愉快。交互式控制台会话的主要问题是,你没有像浏览器那样触发请求,这意味着 g
、request
等不可用。但是你想测试的代码可能依赖于它们,那么你能做什么呢?
这就是一些辅助函数派上用场的地方。但请记住,这些函数不仅用于交互式 shell,还用于单元测试和其他需要伪造请求上下文的情况。
通常建议你先阅读 请求上下文。
命令行界面¶
从 Flask 0.11 开始,推荐的 shell 工作方式是 flask shell
命令,它可以为你自动完成很多操作。例如,shell 会自动使用已加载的应用程序上下文进行初始化。
有关更多信息,请参阅 命令行界面。
创建请求上下文¶
从 shell 创建正确的请求上下文的最简单方法是使用 test_request_context
方法,该方法为我们创建一个 RequestContext
>>> ctx = app.test_request_context()
通常你会使用 with
语句使此请求对象处于活动状态,但在 shell 中,手动使用 push()
和 pop()
方法更容易
>>> ctx.push()
从那时起,你可以使用请求对象,直到你调用 pop
>>> ctx.pop()
触发请求前/后¶
仅创建请求上下文,你仍然没有运行通常在请求之前运行的代码。如果你在请求前回调中连接到数据库,或者当前用户未存储在 g
对象等,这可能会导致你的数据库不可用。
但这很容易自己完成。只需调用 preprocess_request()
>>> ctx = app.test_request_context()
>>> ctx.push()
>>> app.preprocess_request()
请记住,preprocess_request()
函数可能会返回一个响应对象,在这种情况下,只需忽略它。
要关闭请求,你需要在请求后函数(由 process_response()
触发)对响应对象进行操作之前稍微处理一下
>>> app.process_response(app.response_class())
<Response 0 bytes [200 OK]>
>>> ctx.pop()
注册为 teardown_request()
的函数在上下文弹出时自动调用。因此,这是自动清理请求上下文所需的资源(例如数据库连接)的理想位置。
进一步改善 Shell 体验¶
如果你喜欢在 shell 中进行实验的想法,请创建自己的模块,其中包含你想星号导入到交互式会话中的内容。在那里,你还可以为常见的事情定义更多辅助方法,例如初始化数据库、删除表等。
只需将它们放入一个模块(如 shelltools
)并从中导入
>>> from shelltools import *