1. 程式人生 > >Flask1.0.2系列(十九) 在Shell下工作

Flask1.0.2系列(十九) 在Shell下工作

英文原文地址:http://flask.pocoo.org/docs/1.0/shell/

若有翻譯錯誤或者不盡人意之處,請指出,謝謝~


        (新增於版本0.3。)

        很多人喜歡Python的原因之一是其有用互動式shell。shell允許你實時地執行Python命令並且立即會得到一個返回結果。Flask本身不包含一個互動式shell,因為它不需要預先設定任何特定的設定,僅僅匯入你的應用程式並且開始執行即可。

        有一些方便的助手可以使你在shell中獲取一個更愉快的體驗。互動式控制檯會話的最大問題在於,你沒有像瀏覽器一樣觸發一個請求,這意味著

grequest以及其他東西你都無法使用。但是有些測試程式碼可能是依賴於它們的,因此,你該怎麼做呢?

        這裡有一些有用的幫助方法。請記住,這些方法不僅僅能被互動式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 *