werkzeug 详解(什么是Werkzeug)
首先,先向大家介紹一下什么是 werkzeug,Werkzeug是一個(gè)WSGI工具包,他可以作為一個(gè)Web框架的底層庫。這里稍微說一下, werkzeug 不是一個(gè)web服務(wù)器,也不是一個(gè)web框架,而是一個(gè)工具包,官方的介紹說是一個(gè) WSGI 工具包,它可以作為一個(gè) Web 框架的底層庫,因?yàn)樗庋b好了很多 Web 框架的東西,例如 Request,Response 等等。
例如我最常用的 Flask 框架就是一 Werkzeug 為基礎(chǔ)開發(fā)的,這也是我要解析一下 Werkzeug 底層的原因,因?yàn)槲蚁胫?Flask 的實(shí)現(xiàn)邏輯以及底層控制。這篇文章沒有涉及到 Flask 的相關(guān)內(nèi)容,只是以 Werkzeug 創(chuàng)建一個(gè)簡單的 Web 應(yīng)用,然后以這個(gè) Web 應(yīng)用為例剖析請求的處理以及響應(yīng)的產(chǎn)生過程。
下面我們以一個(gè)簡短的例子開始,先看看怎么使用 werkzeug,然后再逐步刨析 werkzeug 的實(shí)現(xiàn)原理。
安裝 werkzeug
我希望讀者是在 virtualenv 環(huán)境中跟著我的步伐走得,如果你還不知道什么是 virtualenv,那么你可以在我的博客中搜索一下 virtualenv,然后先弄好,再繼續(xù),因?yàn)楹芸赡芤驗(yàn)橐恍斓臎_突等問題導(dǎo)致你看不到本文中介紹的東西。
ok,下面開始安裝 werkzeug,
|
1 |
pip |
這條命令下去,幾秒鐘之后你就可以使用 werkzeug 了。
一個(gè)簡單地 web 服務(wù)器
接下來,我們就開始使用 werkzeug 來創(chuàng)建一個(gè)簡單的 web 服務(wù)器,這個(gè)服務(wù)器就僅僅返回 “Hello Werkzeug”,沒有其他內(nèi)容。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/usr/bin/env python # encoding: utf-8 import |
這段代碼就實(shí)現(xiàn)了我說的功能,那么我們就來看看這段代碼是怎么運(yùn)作的?
首先,一切都回到最開始的地方開始,從 main 開始看起,可以發(fā)現(xiàn) main 是非常簡單地,只有一個(gè)初始化函數(shù),然后就調(diào)用了 werkzeug 的 run_simple 函數(shù)。okay,我們可以發(fā)現(xiàn)這個(gè) app 其實(shí)是一個(gè) Shortly 對象,這個(gè)類就只實(shí)現(xiàn)了 3 個(gè)方法,一個(gè)是 dispatch_request, wsig_app,call,就這么簡單了,那我們就知道了,關(guān)鍵的代碼都不是這些,應(yīng)該是 run_simple.
run_simple 解析
okay,我們這個(gè)系列博客的目的就是解析 werkzeug 源碼,所以拿到 werkzeug 源碼肯定是我們必須要做的。所以第一步我們就需要從 github 上將 werkzeug clone 下來:
|
1 |
git |
然后,我們就找 run_simple 的代碼咯
|
1 |
vim |
goto line 559
我們可以看到這個(gè)函數(shù)的定義,秉著關(guān)注重點(diǎn)的原則,我們就忽略條件判斷,以一條最簡單地路線來看代碼,那么這里就假設(shè):
|
1 2 3 |
use_debugger |
OK, 那到這里其實(shí) run_simple 調(diào)用的就是 inner 了,那么就來看看 inner 的代碼:
|
1 2 3 4 5 6 7 8 9 10 11 |
646 |
忽略 fd,那么剩下一點(diǎn)點(diǎn)了:
|
1 2 3 4 5 6 |
650 |
好,你應(yīng)該和我一樣有興致得想知道這個(gè) make_server 里面是什么內(nèi)容了,我也很期待,那就跟上去看看。
make_server 的代碼我就不貼了,還是最簡原則,忽略各種條件,那么這里就假設(shè):
|
1 2 |
threaded |
那么代碼也很簡單了,就剩下:
|
1 2 |
546 |
很好,好不容易跟蹤到這,終于上關(guān)鍵了,那就是這個(gè) BaseWSGIServer 了,我們就來看看這個(gè)類實(shí)現(xiàn)了什么功能。
先看這個(gè)類的定義:
|
1 |
443 |
這個(gè)類是繼承自 HTTPServer 的,那么我們就有點(diǎn)底了,這差不多到頭了,已經(jīng)和 Python 的 API 碰上了。好,既然是繼承自 HTTPServer,那么就把他當(dāng)做 HTTPServer,然后繼續(xù)看 run_simple 的代碼,我們一路跟蹤下來,我們發(fā)現(xiàn)了 656 行有一個(gè)srv.serve_forever(),那么這不就是 HTTPServer 的用法嗎? server.serve_forever() 。
okay,到這那么事情已經(jīng)暫告一段落了,雖然很多事情都還沒搞清楚,例如請求是怎么被封裝的,響應(yīng)又在哪里被處理了,例如URL路由之類的怎么操作的。但是,我們已經(jīng)對 Werkzeug 有一個(gè)大概的印象了,知道他低層還是 HTTPServer 實(shí)現(xiàn)的,沒有太多特殊的自定義協(xié)議。在下一章我們會逐步得進(jìn)行進(jìn)行更深層次的解密。歡迎繼續(xù)關(guān)注。
總結(jié)
以上是生活随笔為你收集整理的werkzeug 详解(什么是Werkzeug)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3 从尾部读取_Python
- 下一篇: Windows下nmap命令及Zenma