前言
我們都知道,平時我們使用python來寫web服務的時候一般都會選擇主流框架,flask,django等,那么這些框架是怎么實作web服務的呢?就需要我們了解一下wsgi了,
什么是wsgi?
PythonWeb服務器網關介面(Python Web Server Gateway Interface,縮寫為WSGI)是Python應用程式或框架和Web服務器之間的一種介面,已經被廣泛接受, 它已基本達成它的可移植性方面的目標,
WSGI 沒有官方的實作, 因為WSGI更像一個協議. 只要遵照這些協議,WSGI應用(Application)都可以在任何服務器(Server)上運行, 反之亦然,
WSGI標準在 PEP 333 中定義并被許多框架實作,其中包括現廣泛使用的django框架,
那么,我們為什么要用wsgi呢?首先我們先了解下web作業程序:
1、用戶操作操作瀏覽器發送請求;
2、請求轉發至對應的web服務器
3、web服務器將請求轉交給web應用程式,web應用程式處理請求
4、web應用將請求結果回傳給web服務器,由web服務器回傳用戶回應結果
5、瀏覽器收到回應,向用戶展示
通過上面的內容我們了解到,請求時web服務器是要和應用進行通信的,但是web服務器和Python WEB的開發框架都有很多種,為了我們開發方便所以就有了一套通信標準,
web服務器在將請求轉交給web應用程式之前,需要先將http報文轉換為WSGI規定的格式,
WSGI規定,Web程式必須有一個可呼叫物件,且該可呼叫物件接收兩個引數,回傳一個可迭代物件:
1、environ:字典,包含請求的所有資訊
2、start_response:在可呼叫物件中呼叫的函式,用來發起回應,引數包括狀態碼,headers等
那么我們了解了wsgi就讓我們現在來寫一個web服務吧
demo展示
這是我們的檔案結構,一個是http處理函式,一個用來啟動服務器

這是我們的http處理函式,用來獲取environ字典中的path_info,也就是獲取請求路徑,然后在前端展示,

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def helloword(environ, start_response):
status = "200 OK"
response_headers = [('Content-Type', 'text/html')]
start_response(status, response_headers)
path = environ['PATH_INFO'][1:] or 'hello word'
return [b'<h1> %s </h1>' % path.encode()]
這是用來啟動WSGI服務器處理驗證的方法,使用Python內置的WSGI服務器模塊wsgiref,撰寫test1.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
WSGI服務器實作
"""
from wsgiref.simple_server import make_server
from test2 import helloword
def main():
server = make_server('localhost', 8001, helloword())
print('Serving HTTP on port 8001...')
server.serve_forever()
if __name__ == '__main__':
main()
然后我們運行test1,服務就啟動了

瀏覽器輸入localhost:8001就能看見test2中回傳的內容了

Flask與WSGI
Flask中的程式實體app就是一個可呼叫物件,我們創建app實體時所呼叫的Flask類實作了__call方法,__call方法呼叫了wsgi_app()方法,該方法完成了請求和響應的處理,WSGI服務器通過呼叫該方法傳入請求資料,獲取回傳資料:
def wsgi_app(self, environ, start_response):
ctx = self.request_context(environ)
error = None
try:
try:
ctx.push()
response = self.full_dispatch_request()
except Exception as e:
error = e
response = self.handle_exception(e)
except: # noqa: B001
error = sys.exc_info()[1]
raise
return response(environ, start_response)
finally:
if self.should_ignore_error(error):
error = None
ctx.auto_pop(error)
def __call__(self, environ, start_response):
return self.wsgi_app(environ, start_response)
wsgiref.simple_server中的demo

好啦,大家快去試試吧!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/23095.html
標籤:其他
上一篇:線性代數中矩陣的乘法
下一篇:進來看看吧,救救孩子
