Python flask @app.route

轉載自:http://www.cnblogs.com/alexyuyu/p/6243353.htmlhtml

 

下面是Flask主頁給咱們的第一個例子,咱們如今就由它入手,深刻理解「@app.route()」是如何工做的。git

@app.route和其它裝飾器github

要想明白「@app.route()」的工做原理,咱們首先須要看一看Python中的裝飾器(就是以「@」開頭的那玩意,下面接着函數定義)。服務器

究竟什麼是裝飾器?沒啥特別的。裝飾器只是一種接受函數(就是那個你用「@」符號裝飾的函數)的函數,並返回一個新的函數。app

當你裝飾一個函數,意味着你告訴Python調用的是那個由你的裝飾器返回的新函數,而不單單是直接返回原函數體的執行結果。函數

還不是很明白?這裏是一個簡單的例子:測試

運行上述代碼會輸出如下結果:

Entering Function
Hello World
Exited Function

很好!this

如今咱們有點明白怎樣建立咱們本身的「@app.route()」裝飾器了,但你可能會注意到有一個不一樣點,就是咱們的simple_decorator不能夠接受任何參數, 但「@app.route()」卻能夠。spa

那麼咱們怎樣才能給咱們的裝飾器傳參數?要實現這個咱們只需建立一個「decorator_factory」函數,咱們調用這個函數,返回適用於咱們函數的裝飾器。如今看看若是實現它。3d

給咱們的輸出是:

Start
Hello World
End
請注意在咱們寫@decorator_factory(「Start」, 「End」)時,咱們實際調用的是decorator_factory函數,實際返回的裝飾器已經被用上了,代碼很整潔,對吧?

把「app」放進「app.route」

如今咱們掌握了裝飾器怎樣工做的所有前置知識 ,能夠從新實現Flask API的這個部分了,那麼把咱們的目光轉移到「app」在咱們Flask應用中的重要地位上面來。

在開始解釋Flask對象裏面發生了什麼以前,咱們先建立咱們本身的Python類NotFlask。

這不是個頗有趣的類,不過有同樣值得注意,就是這個類的方法也能夠被用做裝飾器,因此讓咱們把這個類寫得更有趣一點,加一個稱做 route的方法,它是一個簡單的裝飾器工廠。

這個裝飾器和咱們以前建立的那些最大的不一樣,在於咱們不想修改被咱們裝飾的函數的行爲,咱們只是想得到它的引用。

因此,最後一步是咱們打算去利用一個特性,就是用裝飾器函數的副產品去保存一個提供給咱們的路徑之間的連接,裝飾器函數應該與它關聯起來。

爲了實現這個,咱們給咱們的NotFlask對象加一個「routes」字典,當咱們的「decorator」函數被調用,路徑將被插入新字典中函數對應的位置。

如今咱們就要完成了!可若是無法訪問內部的視圖函數,保存路徑的字典又有什麼用?讓咱們加入一個方法serve(path),當給定的路徑存在時運行一個函數並給們我結果,當路徑還沒有註冊時則拋出一個異常。

在這個系列咱們只關注重現那些熱門庫提供的友好API,因此鉤掛「serve」方法實現一個HTTP服務器其實有一點超出本文的範圍,固然結果是肯定的,運行下述片斷:

咱們會看到:

Hello World!

咱們已經完成了一個的Flask網頁上第一個例子的很是簡單的重現,讓咱們寫一些快速測試檢測咱們簡單重現的Flask的「@app.route()」是否正確。

吸口氣。

徹底正確!因此,僅僅是一個簡單的包含一個字典的裝飾器, 就重現了Flask的「app.route()」裝飾器的基本的行爲。

在本系列的下一篇,也是Flask的app.route()的最後一篇,將經過解析下面這個例子來解釋動態URL模式是如何工做。

相關文章
相關標籤/搜索