日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

werkzeug 详解(什么是Werkzeug)

發(fā)布時(shí)間:2023/12/15 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 werkzeug 详解(什么是Werkzeug) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先,先向大家介紹一下什么是 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
install
Werkzeug

這條命令下去,幾秒鐘之后你就可以使用 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
os from
werkzeug
.
serving
import
run_simple from
werkzeug
.
wrappers
import
Request
,

Response from
werkzeug
.
wsgi
import
SharedDataMiddleware class

Shortly
(
object
)
:
def
dispatch_request
(
self
,

request
)
:
return

Response
(
‘Hello Werkzeug!’
)
def
wsgi_app
(
self
,

environ
,

start_response
)
:
request

=

Request
(
environ
)
response

=

self
.
dispatch_request
(
request
)
return

response
(
environ
,

start_response
)
def
__call__
(
self
,

environ
,

start_response
)
:
return

self
.
wsgi_app
(
environ
,

start_response
) def
create_app
(
with_static
=
True
)
:
app

=

Shortly
(
)
if

with_static
:
app
.
wsgi_app

=

SharedDataMiddleware
(
app
.
wsgi_app
,

{

‘/static’
:

os
.
path
.
join
(
os
.
path
.
dirname
(
__file__
)
,

‘static’
)
}
)
return

app if

__name__

==

‘__main__’
:
app

=

create_app
(
)
run_simple
(
‘127.0.0.1’
,

6666
,

app
,

use_debugger
=
True
,

use_reloader
=
True
)

這段代碼就實(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
clone

https
:
//github.com/mitsuhiko/werkzeug.git

然后,我們就找 run_simple 的代碼咯

1

vim
werkzeug
/
serving
.
py

goto line 559

我們可以看到這個(gè)函數(shù)的定義,秉著關(guān)注重點(diǎn)的原則,我們就忽略條件判斷,以一條最簡單地路線來看代碼,那么這里就假設(shè):

1 2 3

use_debugger

=

False static_files

=

False use_reloader

=

False

OK, 那到這里其實(shí) run_simple 調(diào)用的就是 inner 了,那么就來看看 inner 的代碼:

1 2 3 4 5 6 7 8 9 10 11

646
:

try
: 647
:

fd

=

int
(
os
.
environ
[
‘WERKZEUG_SERVER_FD’
]
) 648
:

except

(
LookupError
,

ValueError
)
: 649
:

fd

=

None 650
:

srv

=

make_server
(
hostname
,

port
,

application
,

threaded
, 651
:

processes
,

request_handler
, 652
:

passthrough_errors
,

ssl_context
, 653
:

fd
=
fd
) 654
:

if

fd
is

None
: 655
:

log_startup
(
srv
.
socket
) 656
:

srv
.
serve_forever
(
)

忽略 fd,那么剩下一點(diǎn)點(diǎn)了:

1 2 3 4 5 6

650
:

srv

=

make_server
(
hostname
,

port
,

application
,

threaded
, 651
:

processes
,

request_handler
, 652
:

passthrough_errors
,

ssl_context
, 653
:

fd
=
fd
) 656
:

srv
.
serve_forever
(
)

好,你應(yīng)該和我一樣有興致得想知道這個(gè) make_server 里面是什么內(nèi)容了,我也很期待,那就跟上去看看。

make_server 的代碼我就不貼了,還是最簡原則,忽略各種條件,那么這里就假設(shè):

1 2

threaded

=

False processes

=

1

那么代碼也很簡單了,就剩下:

1 2

546
:

return

BaseWSGIServer
(
host
,

port
,

app
,

request_handler
, 547
:

passthrough_errors
,

ssl_context
,

fd
=
fd
)

很好,好不容易跟蹤到這,終于上關(guān)鍵了,那就是這個(gè) BaseWSGIServer 了,我們就來看看這個(gè)類實(shí)現(xiàn)了什么功能。

先看這個(gè)類的定義:

1

443
:

class

BaseWSGIServer
(
HTTPServer
,

object
)
:

這個(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。