【python socket程式設計】—— 3.響應

Harpsichord1207發表於2019-02-16

前文:【python socket程式設計】—— 2.解析http請求頭


web的框架和解析請求的Request類我們都寫好了,現在唯一要做的就是處理相應。編寫一個route_dict字典,keyurl路徑,value是對應這個url的相應函式,並使用response_for_request作為唯一的介面接受請求,並從route_dict獲取對應的函式,如下:

route_dict = {
    `/`: route_index,
}


def response_for_request(request):
    path = request.parse_path()[0]
    return route_dict.get(path, error_handle)(request)

當請求`/`時,response_for_request根據request解析到`/`這個path,然後從route_dict得到route_index這個函式,最後返回route_index(request)的結果。route_index需要按照http響應的格式返回位元組資料,例如:

HTTP/1.1 200 OK 
Content-Type: text/html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>INDEX</title>
</head>
<body>
<h1>Index Page</h1>
</body>
</html>

與請求的格式類似,第一行HTTP/1.1 200 OK分別表示協議、狀態碼和狀態,Content-Type: text/htmlheader中的key: value形式的內容,這裡只有一行,常見的還有Set-CookieContent-Length等;然後是空行;最後就是html頁面的內容。假設以上內容都以str的形式放在response變數中,那麼route_index可以寫成:

def route_index(request):
    print(`Request: `, request.content)
    response = `...` # 上文的內容,省略 
    print(`Response: `, response)
    return response.encode(encoding=`utf-8`)

此時執行runserver,在瀏覽器輸入url,就可以看到內容Index Page


回覆響應的原理就是這樣,後續每增加一個路徑,就在字典中增加一條item及增加一個對應的響應函式。當使用者請求的路徑不在route_dict中時,就返回error_handle這個函式,我們只要讓它返回類似404 NOT FOUND之類的內容就可以了。


下一篇文章:【python socket程式設計】—— 4.實現redirect函式

相關文章