使用 Shell

变更日志

0.3 版新增。

每个人都喜欢 Python 的原因之一是交互式 shell。它基本上允许你实时执行 Python 命令并立即获得结果。Flask 本身不带交互式 shell,因为它不需要任何特定的预先设置,只需导入你的应用程序并开始操作即可。

然而,有一些方便的帮助程序可以使在 shell 中操作成为一种更愉快的体验。交互式控制台会话的主要问题是你没有像浏览器那样触发请求,这意味着 grequest 和其他内容不可用。但是你想要测试的代码可能依赖于它们,那么你可以怎么做?

这就是一些帮助程序函数派上用场的地方。但是请记住,这些函数不仅适用于交互式 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 *