python WSGI 介面實現(1)

2021-08-17 11:16:01 字數 4228 閱讀 2511

wsgi, 可能很多做python web 開發同學的都聽過, 但是 wsgi 是什麼, 用來幹什麼,今天我說一些自己的理解,有錯誤的地方或者描述不當的地方,望指正。

webserver 顧名思義 就是提供web服務, 包括靜態頁面和動態頁面。那麼當伺服器接受到來自client的請求之後,他是如何和我們的web 應用進行通訊的 ,這就是wsgi的作用。 接受http請求 解析http 傳送 響應 這些比較底層的工作 就是wsgi的工作。於是 python 就有了wsgi介面 ,那些工作都交給wsgi處理, 而我們更專注用python 來實現業務層面的邏輯。

話不多說,先上一段** 利用socket 實現乙個簡易的伺服器

做過web開發的同學 應該都對http協議有一定的了解, 我在這裡只做簡單描述

當我們在瀏覽器輸入例如  http://loalhost:5000/test 這樣的url  他其實是有 protocol:host_name:port/path 這樣的形式組成的

在你的瀏覽器能夠傳送 http 請求之前,它需要與 web 伺服器建立乙個 tcp 連線。然後會在 tcp 連線中傳送 http 請求,並等待伺服器返回 http 響應

接下來看看wsgi

# *-* coding: utf-8 *-*

import socket

import stringio

class wsgiserver(object):

address_family = socket.af_inet

socket_type = socket.sock_stream

request_queue_size = 5

def __init__(self, address):

self.socket = socket.socket(self.address_family, self.socket_type)

self.socket.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)

self.socket.bind(address)

self.socket.listen(self.request_queue_size)

self.host, self.port = self.socket.getsockname()

self.server_name = socket.getfqdn(self.host)

def server_forever(self):

print "start listting"

while 1:

self.connection, client_address = self.socket.accept()

print "recive a request!"

self.request_handler()

def request_handler(self):

self.request_data = self.connection.recv(1024)

self.parse_request()

env = self.get_env()

self.finish_response(result)

def parse_request(self):

request_data = self.request_data.splitlines()

request_line = request_data[0].strip('\r\n')

self.request_method, self.request_path, self.request_version = request_line.split()

def get_env(self):

env = {}

# wsgi必要引數

env['wsgi.input'] = stringio.stringio(self.request_data) #返回乙個

env['wsgi.errors'] = sys.stderr

env['wsgi.multithread'] = false

env['wsgi.multiprocess'] = false

env['wsgi.run_once'] = false

### cgi 必需變數

env['request_method'] = self.request_method # get

env['path_info'] = self.request_path # 請求路徑

對於這個請求 他的工作 流程大概是這樣子的:

web 框架或應用生成 http 狀態碼和 http 響應頭部,然後將它傳給 start_response 函式,伺服器會將其儲存起來。同時,web 框架或應用也會返回 http 響應正文。

伺服器將狀態碼、響應頭部及響應正文組裝成乙個 http 響應,然後將其傳送至客戶端

或者更詳細一點:

然後,伺服器讀取乙個請求

然後,伺服器會解析這個請求

然後,伺服器會使用請求資料來構建乙個 environ 字典

最終,伺服器將 http 響應回送給客戶端

貝殼介面庫記錄1 介面圓角實現

這段時間來對貝殼介面庫的學習,對現實技術和細節已經非常熟悉了。做一些總結。一般寫圓角的時候直接不onsize裡 hrgn hrgn createroundrectrgn 0,0,601,440,8,8 setwindowrgn m hwnd,hrgn,true 會寫css的對上面的圖形結構一定不陌生...

python實現介面自動化(1)

http簡介 http協議是什麼呢,是乙個基於 請求 與 響應 模式的,無狀態,應用層的協議 url詳解 http https 為兩種協議型別,第一種為不加密的,第二種加密的 www.baidu.com 稱為主機位址或者網域名稱 192.168.1.1 8080 位址加埠號 localhost808...

C 介面類實現的簡單例子(1)

介面是乙個沒有被實現的特殊的類,它是一系列操作的集合,我們可以把它看作是與其他物件通訊的協議。c 中沒有提供類似inte ce這樣的關鍵 字來定義介面,但是mircrosoft c 中提供了 declspec novtable 來修飾乙個類,來表示該類沒有虛函式表,也就是虛函式都是純虛的。所以利用它...