使用Shell¶
0.3 新版功能.
Python 拥有的交互式 Shell 是人人都喜欢它的一个重要原因。 交互式 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 然后在 Shell 中导入它):
>>> from shelltools import *