一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 深入解析Python中的WSGI接口

深入解析Python中的WSGI接口

2020-06-27 11:36_Zhao Python

這篇文章主要介紹了深入解析Python中的WSGI接口,WSGI接口是Python中網絡框架連接服務器的必備工具,需要的朋友可以參考下

概述

WSGI接口包含兩方面:server/gateway 及 application/framework。
server調用由application提供的可調用對象。
另外在server和application之間還可能有一種稱作middleware的中間件。
可調用對象是指:函數、方法、類或者帶有callable方法的實例。
關于application

函數、方法、類及帶有callable方法的實例等可調用對象都可以作為the application object。
WSGI協議要求:
the application object接受兩個參數且可以被多次調用

這兩個參數分別為:
1.CGI式的字典;
2.回調函數:application用來向server傳遞http狀態碼/消息/http頭

另外協議要求可調用對象必須將響應體封裝成一個可迭代的strings返回。

?
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
# the application object. 可以使用其他名字,
# 但是在使用mod_wsgi 時必須為 "application"
def application( environ, start_response):
# 函數接受兩個參數:
# environ :包含有CGI 式環境變量的字典,由server負責提供內容
# start_response:由server提供的回調函數,其作用是將狀態碼和響應頭返回給server
 
# 構造響應體,以可迭代字符串形式封裝
  response_body = 'The request method was %s' % environ['REQUEST_METHOD']
 
# HTTP 響應碼及消息
  status = '200 OK'
 
# 提供給客戶端的響應頭.
# 封裝成list of tuple pairs 的形式:
# 格式要求:[(Header name, Header value)].
  response_headers = [('Content-Type', 'text/plain'),
            ('Content-Length', str(len(response_body)))]
 
# 將響應碼/消息及響應頭通過傳入的start_reponse回調函數返回給server
  start_response(status, response_headers)
 
# 響應體作為返回值返回
# 注意這里被封裝到了list中.
  return [response_body]

關于server

從概述中可以知道,WSGI server必須要調用application,同時,從application的協議要求可知:
1. WSGI server必須向application提供環境參數,因此,自身也必須能夠獲取環境參數。
2. WSGI server接收application的返回值作為響應體。
最簡單的WSGI server為Python自帶的wsgiref.simple_server
示例如下:

?
1
2
3
from wsgiref.simple_server import make_server
srv = make_server('localhost', 8080, hello_world)
srv.serve_forever()

關于middleware

middleware的概念沒有appllication和server那么容易理解。
假設一個符合application標準的可調用對象,它接受可調用對象作為參數,返回一個可調用對象的對象。
那么對于server來說,它是一個符合標準的可調用對象,因此是application。
而對于application來說,它可以調用application,因此是server。
這樣的可調用對象稱為middleware。

middleware的概念非常接近decorator。

以一個路由的例子示例:

?
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
import re
 
# 這是一個標準的application object
def index(environ, start_response):
  start_response('200 OK', [('Content-Type', 'text/html')])
  return ['index page']
 
# 這是一個標準的application object
def hello(environ, start_response):
  start_response('200 OK', [('Content-Type', 'text/html')])
  return ['hello page']
 
# 這是一個標準的application object
def not_found(environ, start_response):
  start_response('404 NOT FOUND', [('Content-Type', 'text/plain')])
  return ['Not Found Page']
 
# map urls to functions
urls = [
  (r'^$', index),
  (r'hello/?$', hello)
]
# 這是一個middleware
# 根據不同的route返回不同的application object
def application(environ, start_response):
  path = environ.get('PATH_INFO', '').lstrip('/')
  for regex, callback in urls:
    match = re.search(regex, path)
    if match is not None:

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人精品一区二区阿娇陈冠希 | 青青草国产精品久久久久 | 狠狠色狠狠色综合系列 | 女教师巨大乳孔中文字幕免费 | 美女脱了内裤让男生玩屁股 | 特级av毛片免费观看 | 美女脱一净二净不带胸罩 | 色老板最新网站视频地址 | 美女尿口照片 | 电车痴汉(han) | 成人免费体验区福利云点播 | 天堂va在线高清一区 | 接吻吃胸摸下面啪啪教程 | 欧美性白人顶级hd | 成人欧美1314www色视频 | a级特黄毛片免费观看 | 国产一卡2卡3卡四卡精品网 | 亚洲一区二区三区免费视频 | 不卡一区二区三区卡 | 雪恋电影完整版免费观看 | 男人操女人动图 | 日韩欧美一区二区三区中文精品 | 国产一区日韩二区欧美三区 | 男女拍拍拍免费视频网站 | 日本成人黄色网址 | 亚洲免费闲人蜜桃 | 国产99视频精品免费视频7 | 亚洲视频在线观看地址 | 日韩免费在线视频观看 | 9久久9久久精品 | 我年轻漂亮的继坶2中字在线播放 | 亚洲mv国产精品mv日本mv | 成人午夜爽爽爽免费视频 | a男人的天堂久久a毛片 | 成人福利视频网址 | 毛片视频网站在线观看 | 国产美女极品免费视频 | 精品精品国产自在久久高清 | 丝袜足控免费网站xx动漫漫画 | 人人爽人人香蕉 | 60岁妇女毛片免费观看 |