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