日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久九九久久九九 | 黄色无遮挡网站 | 国产在线观看网站 | 每日更新av | 日本成人在线不卡 | 国产精品一区二区在线看 | 99视频观看 | 狠狠干2018| 欧美成人午夜免费视在线看片 | 噜噜色av | √天堂8资源中文在线 | 噜噜噜亚洲色成人网站 | 欧美在线免费观看视频 | 国产-第1页-浮力影院 | 国产做爰全免费的视频软件 | 日韩一区二区在线看 | 色欲av伊人久久大香线蕉影院 | 阿v天堂在线 | 日韩在线观看视频网站 | 国产黄色的视频 | 国产免费一区二区三区最新6 | 96精品在线 | 99久久久无码国产精品衣服 | 含羞草一区二区 | 秋霞无码一区二区 | 一区二区视频 | 久久女同| 老王66福利网 | 蜜桃久久久aaaa成人网一区 | 另类性姿势bbwbbw| 91国产在线看 | 日韩亚洲欧美一区二区 | 国产成人精品777777 | 国产100页 | 人与动物黄色片 | 国产高中女学生第一次 | 手机av在线看 | 欧美日韩精品一二三区 | 影音先锋男人的天堂 | 亚洲爆爽av| 91精品久久香蕉国产线看观看 | 成人黄色在线 | 热久久国产精品 | 一区二区在线看 | 欧美精品一区二区成人 | 波多野结衣中文字幕一区 | 色亚洲影院| 精品国产一区二区视频 | 深夜视频在线观看 | 啪啪免费网站 | 亚洲人人干| 青草久久久久 | 国产亚洲精品美女 | 你懂的av在线 | 国产亚洲成av人在线观看导航 | 三级网站视频 | 欧美一级特黄aa大片 | 99毛片| 人妻少妇偷人精品久久性色 | 小辣椒导航| 久草福利资源站 | 男女搞黄网站 | 老色鬼在线| 日本精品一区二区在线观看 | 两性囗交做爰视频 | 高清一区二区三区视频 | 国产永久免费视频 | 欧美猛操 | 这里只有精品免费视频 | 97超碰在线免费 | 国产va亚洲va在线va | 51精品国产 | 亚洲国产欧美另类 | 九草视频在线观看 | 庆余年三| 德国经典free性复古xxxx | 亚洲无毛视频 | 51国产在线 | 日本在线中文字幕专区 | 日韩免费视频一区二区视频在线观看 | 91成人在线免费观看 | 黄色大片av| 中文字幕免费高清在线 | 黄色网址哪里有 | 国产高清在线免费 | 特级西西444www高清大胆免费看 | 超碰精品在线 | 日本中文视频 | 91黄瓜视频 | 日本人做爰全过程 | 免费在线看黄色 | 午夜精品99 | 亚洲av鲁丝一区二区三区 | 97视频一区 | 精品久久五月天 | 国产三级理论 | 香蕉av在线 | 大地资源高清播放在线观看 | 91视频色|