使用 Shell — Flask 文档

来自菜鸟教程
Flask/docs/2.0.x/shell
跳转至:导航、​搜索

使用外壳

0.3 版中的新功能。


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

然而,有一些方便的助手可以使在 shell 中玩耍成为一种更愉快的体验。 交互式控制台会话的主要问题是您不会像浏览器那样触发请求,这意味着 grequest 和其他不可用。 但是您要测试的代码可能取决于它们,那么您能做什么呢?

这是一些辅助函数派上用场的地方。 但是请记住,这些函数不仅用于交互式 shell,还用于单元测试和其他需要伪造请求上下文的情况。

一般建议您先阅读请求上下文

命令行界面

从 Flask 0.11 开始,推荐的使用 shell 的方法是 flask 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() 函数可能会返回一个响应对象,在这种情况下只需忽略它。

要关闭请求,您需要在 after 请求函数(由 process_response() 触发)对响应对象进行操作之前进行一些技巧:

>>> app.process_response(app.response_class())
<Response 0 bytes [200 OK]>
>>> ctx.pop()

弹出上下文时会自动调用注册为 teardown_request() 的函数。 因此,这是自动拆除请求上下文所需资源(例如数据库连接)的理想场所。


进一步改善壳牌体验

如果您喜欢在 shell 中进行实验的想法,请为自己创建一个模块,其中包含您想要导入到交互式会话中的内容。 在那里,您还可以为常见的事情定义更多的辅助方法,例如初始化数据库、删除表等。

只需将它们放入一个模块(如 shelltools)并从那里导入:

>>> from shelltools import *