在Shell中使用Flask

0.3 新版功能.

Changelog

喜欢Python的原因之一是交互式的 shell,它可以让你实时运行Python 命令,并且立即得到结果。flask本身并没有交互式shell,因为它不需要预先进行任何特定的设置,只需导入应用程序就可以开始使用了。

有些辅助工具可以让你在 shell 中更愉悦。在交互终端中最大的问题是你不会像浏览器一样触发一个请求,这就意味着无法使用 g 和 request 等对象。那么如何在 shell 中测试依赖这些对象的代码呢?

这就是一些辅助函数的用处所在。但是,请记住,这些函数不仅用于交互式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 *

>>> from shelltools import *