使用 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 *