英文原文地址:http://flask.pocoo.org/docs/1.0/shell/
若有翻译错误或者不尽人意之处,请指出,谢谢~
(新增于版本0.3。)
很多人喜欢Python的原因之一是其有用交互式shell。shell允许你实时地执行Python命令并且立即会得到一个返回结果。Flask本身不包含一个交互式shell,因为它不需要预先设置任何特定的设置,仅仅导入你的应用程序并且开始运行即可。
有一些方便的助手可以使你在shell中获取一个更愉快的体验。交互式控制台会话的最大问题在于,你没有像浏览器一样触发一个请求,这意味着g,request以及其他东西你都无法使用。但是有些测试代码可能是依赖于它们的,因此,你该怎么做呢?
这里有一些有用的帮助方法。请记住,这些方法不仅仅能被交互式shell使用,也能被单元测试以及其他需要伪造请求上下文的情境下使用。
通常,我们推荐你先阅读请求上下文章节。
1. 命令行接口
从Flask0.11开始,要使用shell,我们推荐使用flask shell命令,它能够自动为你做一系列与之相关的事。举个栗子,shell会自动使用加载的应用程序上下文进行初始化。
更多细节请参阅命令行接口一章。
2. 创建一个请求上下文
通过shell创建一个适当的请求上下文最简单的方式是,通过使用test_request_context函数,它能创建一个RequestContext:
>>> ctx = app.test_request_context()
通常,你可以使用with语句来激活这个请求对象,但是在shell中,可以更简单地手动使用push()和pop()函数:
>>> ctx.push()
从这时候开始,你可以一直使用请求对象,直到你调用pop:
>>> ctx.pop()
3. 发送Before/After请求
仅仅是创建一个上下文请求,你仍然不能运行通常运行在请求之前的代码。如果你在请求之前的回调中连接数据库,或者当前用户没有存储在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_reqeust()的方法将会被自动调用。因此这个是一个不错的地方,用来自动销毁请求上下文需要的资源(比如数据库连接)。
4. 进一步改进Shell体验
如果你喜欢在shell中进行试验,那就创建一个模块,里面有你想要在交互式会话中导入的东西。你也可以在这里定义一些有帮助的方法,比如初始化数据库,删除表等等。
将它们写入一个模块(比如shelltools)并且从这里导入这个模块:
>>> from shelltools import *