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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php的wsgi框架结构,理解 WSGI 框架

發(fā)布時間:2025/4/5 php 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php的wsgi框架结构,理解 WSGI 框架 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

This document specifies a proposed standard interface between web servers and Python web applications or frameworks, to promote web application portability across a variety of web servers.

-—–PEP 0333

An Introduction to WSGI

在 java web 領(lǐng)域,支持?servlet API?的 java application 都可運行在支持 servlet API 的 web server (http server) 上。隨著 web 不斷發(fā)展,python application/framework 也如雨后春筍般涌出,如:zope, webware, skunkweb 等等。但是它們的接口存在差異,導(dǎo)致難以跨 web server 運行,所以 python 社區(qū)定義了一種如 servlet API 般標(biāo)準(zhǔn)通用的接口——WSGI。

PEP 0333 – Python Web Server Gateway Interface?是一種?web server or gateway?和 python?web application or framework?之間簡單通用的接口,符合這種接口的 application 可運行在所有符合該接口的 server 上。通俗的講,WSGI 規(guī)范了一種簡單的接口,解耦了 server 和 application,使得雙邊的開發(fā)者更加專注自身特性的開發(fā)。

Web server/gateway: 即 HTTP Server,處理 HTTP 協(xié)議,接受用戶 HTTP 請求和提供并發(fā),調(diào)用 web application 處理業(yè)務(wù)邏輯。通常采用 C/C++ 編寫,代表:apache, nginx 和 IIS。

Python Web application/framework: 專注業(yè)務(wù)邏輯的 python 應(yīng)用或者框架。

The Application/Framework Side

Application/framework 端必須定義一個 callable object,callable object 可以是以下三者之一:

function, method

class

instance with a __call__ method

Callable object 必須滿足以下兩個條件:

接受兩個參數(shù):字典(environ),回調(diào)函數(shù)(start_response,返回 HTTP status,headers 給 web server)

返回一個可迭代的值

基于 callable function 的 application/framework 樣例如下:

Python

1

2

3

def

application

(

environ

,

start_response

)

:

start_response

(

'200 OK'

,

[

(

'Content-Type'

,

'text/plain'

)

]

)

return

[

'This is a python application!'

]

基于 callable class 的 application/framework 樣例如下:

Python

1

2

3

4

5

6

7

8

class

ApplicationClass

(

object

)

:

def

__init__

(

self

,

environ

,

start_response

)

:

self

.

environ

=

environ

self

.

start_response

=

start_response

def

__iter__

(

self

)

:

self

.

start_response

(

'200 OK'

,

[

(

'Content-type'

,

'text/plain'

)

]

)

yield

"Hello world!n"

The Server/Gateway Side

Server/gateway 端主要專注 HTTP 層面的業(yè)務(wù),重點是接收 HTTP 請求和提供并發(fā)。每當(dāng)收到 HTTP 請求,server/gateway 必須調(diào)用 callable object:

接收 HTTP 請求,但是不關(guān)心 HTTP url, HTTP method 等

為?environ?提供必要的參數(shù),實現(xiàn)一個回調(diào)函數(shù)?start_response,并傳給 callable object

調(diào)用 callable object

我們直接使用支持 WSGI 框架的?wsgiref?庫,編寫一個樣例:

1

2

3

4

5

6

7

8

9

10

# application/framework side

def

application

(

environ

,

start_response

)

:

start_response

(

'200 OK'

,

[

(

'Content-Type'

,

'text/plain'

)

]

)

return

[

'This is a python application!'

]

# server/gateway side

if

__name__

==

'__main__'

:

from

wsgiref

.

simple_server

import

make_server

server

=

make_server

(

'0.0.0.0'

,

8080

,

application

)

server

.

serve_forever

(

)

運行后,對于任意的 url 和 method,本例的返回值均為 ‘This is a python application!’:

1

2

3

4

5

$

curl

127.0.0.1

:

8080

This

is

a

python

application

!

$

curl

127.0.0.1

:

8080

/

test

This

is

a

python

application

!

Middleware: Components that Play Both Sides

Unix philosophy: do one thing and do it well.

Middleware 處于 server/gateway 和 application/framework 之間,對 server/gateway 來說,它相當(dāng)于 application/framework;對 application/framework 來說,它相當(dāng)于 server/gateway。每個 middleware 實現(xiàn)不同的功能,我們通常根據(jù)需求選擇相應(yīng)的 middleware 并組合起來,實現(xiàn)所需的功能。比如,可在 middleware 中實現(xiàn)以下功能:

根據(jù) url 把用戶請求調(diào)度到不同的 application 中。

負(fù)載均衡,轉(zhuǎn)發(fā)用戶請求

預(yù)處理 XSL 等相關(guān)數(shù)據(jù)

限制請求速率,設(shè)置白名單

WSGI 的 middleware 體現(xiàn)了 unix 的哲學(xué)之一:do one thing and do it well。事實上,在定義 WSGI 框架的時候,設(shè)計者就要求 server/gateway 和 application/framework 雙方盡可能的簡單,同時也要求 middleware 設(shè)計的簡單而專一,PEP 333 提到:

If middleware can be both simple and robust, and WSGI is widely available in servers and frameworks, it allows for the possibility of an entirely new kind of Python web application framework: one consisting of loosely-coupled WSGI middleware components.

本例實現(xiàn)了一個 IPBlacklist 的 middleware:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

class

IPBlacklistMiddleware

(

object

)

:

def

__init__

(

self

,

app

)

:

self

.

app

=

app

def

__call__

(

self

,

environ

,

start_response

)

:

ip_addr

=

environ

.

get

(

'HTTP_HOST'

)

.

split

(

':'

)

[

0

]

if

ip_addr

not

in

(

'127.0.0.1'

)

:

return

forbidden

(

start_response

)

return

self

.

app

(

environ

,

start_response

)

def

forbidden

(

start_response

)

:

start_response

(

'403 Forbidden'

,

[

(

'Content-Type'

,

'text/plain'

)

]

)

return

[

'Forbidden'

]

def

application

(

environ

,

start_response

)

:

start_response

(

'200 OK'

,

[

(

'Content-Type'

,

'text/plain'

)

]

)

return

[

'This is a python application!'

]

if

__name__

==

'__main__'

:

from

wsgiref

.

simple_server

import

make_server

application

=

IPBlacklistMiddleware

(

application

)

server

=

make_server

(

'0.0.0.0'

,

8080

,

application

)

server

.

serve_forever

(

)

測試如下:

1

2

3

4

5

6

7

# 從本機測試

$

curl

127.0.0.1

:

8080

/

test

This

is

a

python

application

!

# 從其它主機測測試

$

curl

10.10.10.2

:

8080

/

test

Forbidden

Path Dispatching

至此樣例的一個不足之處是對于任意的 url 和 method,程序的返回值均為 ‘This is a python application!’,所以我們需要增加 path dispatch 功能。由于 WSGI 框架下的 server/gateway 不處理 url 和 method,所以 url mapping 需由 application/framework 端完成。注意到參數(shù)?environ,它包含以下變量:

REQUEST_METHOD: 即 HTTP method

PATH_INFO: 即 HTTP url

所以 application/framework 可以根據(jù) environ 的 REQUEST_METHOD 和 PATH_INFO 實現(xiàn) path dispatch,樣例如下:

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

32

33

34

35

36

37

38

39

class

IPBlacklistMiddleware

(

object

)

:

def

__init__

(

self

,

app

)

:

self

.

app

=

app

def

__call__

(

self

,

environ

,

start_response

)

:

ip_addr

=

environ

.

get

(

'HTTP_HOST'

)

.

split

(

':'

)

[

0

]

if

ip_addr

not

in

(

'127.0.0.1'

)

:

return

forbidden

(

start_response

)

return

self

.

app

(

environ

,

start_response

)

def

dog

(

start_response

)

:

start_response

(

'200 OK'

,

[

(

'Content-Type'

,

'text/plain'

)

]

)

return

[

'This is dog!'

]

def

cat

(

start_response

)

:

start_response

(

'200 OK'

,

[

(

'Content-Type'

,

'text/plain'

)

]

)

return

[

'This is cat!'

]

def

not_found

(

start_response

)

:

start_response

(

'404 NOT FOUND'

,

[

(

'Content-Type'

,

'text/plain'

)

]

)

return

[

'Not Found'

]

def

forbidden

(

start_response

)

:

start_response

(

'403 Forbidden'

,

[

(

'Content-Type'

,

'text/plain'

)

]

)

return

[

'Forbidden'

]

def

application

(

environ

,

start_response

)

:

path

=

environ

.

get

(

'PATH_INFO'

,

''

)

.

lstrip

(

'/'

)

mapping

=

{

'dog'

:

dog

,

'cat'

:

cat

}

call_back

=

mapping

[

path

]

if

path

in

mapping

else

not_found

return

call_back

(

start_response

)

if

__name__

==

'__main__'

:

from

wsgiref

.

simple_server

import

make_server

application

=

IPBlacklistMiddleware

(

application

)

server

=

make_server

(

'0.0.0.0'

,

8080

,

application

)

server

.

serve_forever

(

)

測試如下:

1

2

3

4

5

6

7

8

$

curl

127.0.0.1

:

8080

/

dog

This

is

dog

!

$

curl

127.0.0.1

:

8080

/

cat

This

is

cat

!

$

curl

127.0.0.1

:

8080

/

monkey

Not

Found

總結(jié)

以上是生活随笔為你收集整理的php的wsgi框架结构,理解 WSGI 框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 波多野结衣亚洲一区二区 | china国产乱xxxxx绿帽 | 婷婷的五月天 | 韩日精品在线 | 国产又粗又猛又色又 | 91成人在线 | 国产最新视频 | 久久一区二区精品 | 丰满孕妇性春猛交xx大陆 | 精品伦精品一区二区三区视频 | 久久久精品免费 | 免费毛片在线 | 日日操夜夜骑 | 成人人人人人欧美片做爰 | 日韩欧美国产精品综合嫩v 国产小毛片 | 久久婷婷一区 | 国产欧美亚洲一区二区 | 欧美日韩中文国产一区发布 | 久久福利网站 | 国产日韩在线观看一区 | 被室友玩屁股(h)男男 | 国产精品99久久久久久人 | 国产精品永久在线 | av收藏小四郎最新地址 | 日韩欧美大片 | 国产成人精品久久二区二区91 | 毛片久久久久 | 一级黄色a毛片 | 色噜噜狠狠一区二区 | 捆绑束缚调教 | 黄色在线免费 | 草免费视频 | 成人三级晚上看 | 久久夜夜操妹子 | 黄骗免费网站 | 国产精品第八页 | 免费乱淫视频 | 国产视频精选 | 国产情侣免费视频 | 国内自拍偷拍 | 欧美日视频| 91精品入口 | 精品国产18久久久久久二百 | 天堂av免费观看 | 极品美女一区二区三区 | 久久精品亚洲一区二区 | 粉嫩一区二区三区 | 国产精品久久久久桃色tv | 日本视频一区二区 | 激情视频网址 | 青青操91 | 欧美日韩成人一区二区三区 | 亚洲女成人图区 | 国产乱码精品1区2区3区 | 四虎影视8848hh | 一区二区三区不卡在线 | 奇米精品一区二区三区在线观看 | 三级在线观看 | xxxxxxxx黄色片| 91精品人妻互换一区二区 | 韩国三级视频在线观看 | 午夜久久久久久 | 老女人一区 | av播播| 嫩草影院懂你的影院 | 欧美日韩一级在线观看 | 国产精品av免费观看 | 又大又粗欧美黑人aaaaa片 | 国产精品亚洲色图 | 在线视频在线观看 | 午夜精品免费观看 | 国产www精品 | 奇米影视第四色777 波多野结衣一区二区三区免费视频 | www.色亚洲 | 久久第一页 | 亚洲精品国产电影 | 精品国产乱码久久久久久88av | 日韩欧美专区 | 久久久88| 青青成人| 亚洲精品一区二区三区区别 | 欧美福利影院 | 亚洲欧美另类在线视频 | 理论片高清免费理伦片 | 2019国产在线 | 蜜桃久久av| 在线免费看黄视频 | 91美女视频网站 | 精品在线观看免费 | 男男免费视频 | 中文字幕在线2021 | 国产20页| 日韩黄色免费电影 | 日本一区中文 | 久精品在线观看 | 婷婷伊人| 亚洲一区电影在线观看 | 久草资源网 | 在线观看一级片 |