開發與維運

根據不同的請求返回不同的內容

本文來自於千鋒教育在阿里雲開發者社區學習中心上線課程《Python入門2020最新大課》,主講人姜偉。

根據不同的請求返回不同的內容

將前面的代碼簡化一下:

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 8090))
server_socket.listen(128)

while True:
    client_socket, client_addr = server_socket.accept()
    data = client_socket.recv(1024).decode('utf8')

    # 響應頭
    response_header = 'HTTP/1.1 200 OK\n' + 'content-type:text/html\n'
    response_header += '\n'

    #響應體
    response_body = 'hello world'

    # 響應
    response = response_header + response_body

    # 發送給客戶端
    client_socket.send(response.encode('utf8'))

這段代碼運行時訪問得到的響應都是 hello world ,現在我們實現根據不同的請求返回不同的內容,使瀏覽器訪問 /register 或 /login 使返回不同的內容。
關於請求的地址我們可以在請求頭的第一行中獲得,而在瀏覽器請求時有可能 data 為空,在循環體中添加如下代碼:

path = ''
if data:  # # 瀏覽器發送過來的數據有可能是空的
    path = data.splitlines()[0].split(' ')[1]
    print('請求的路徑是{}'.format(path))

可以看到在瀏覽器中訪問localhost:8090/login後控制檯輸出了訪問的路徑:

image.png

接下來我們可以通過這個信息來定製不同的 response_body (此時瀏覽器默認的讀取編碼為gbk,需在代碼中調整一下):

if path == '/login':
    response_body = '歡迎來到登錄頁面'
elif path == '/register':
    response_body = '歡迎來到註冊頁面'
elif path == '/':
    response_body = '歡迎來到首頁'

如果我們想以utf8的編碼返回,我們只需要在響應頭中的 content-type:text/htmln 改寫為 content-type:text/html;charset=utf8n,告知瀏覽器相應內容的編碼方式。
當在瀏覽器中什麼也不訪問時,也應該有相應的響應內容,我們可以在分支語句中添加如下分支:

else:
    # 頁面未找到   404 Page Not Found
    response_header = 'HTTP/1.1 404 Page Not Found\n'
    response_body = '對不起,您要查看的頁面不存在!!!'

可以在瀏覽其中訪問效果如下:

image.png

面向對象的服務器封裝

import socket


class MyServer(object):
    def __init__(self, ip, port):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.bind((ip, port))
        self.socket.listen(128)

    def run_forever(self):
        while True:
            client_socket, client_addr = self.socket.accept()
            data = client_socket.recv(1024).decode('utf8')

            path = ''
            if data:
                path = data.splitlines()[0].split(' ')[1]

            response_header = 'HTTP/1.1 200 OK\n'

            if path == '/login':
                response_body = '歡迎來到登錄頁面'
            elif path == '/register':
                response_body = '歡迎來到註冊頁面'
            elif path == '/':
                response_body = '歡迎來到首頁'
            else:
                response_header = 'HTTP/1.1 404 Page Not Found\n'
                response_body = '對不起,您要查看的頁面不存在!!!'

            response_header += 'content-type:text/html;charset=utf8\n'
            response_header += '\n'

            response = response_header + response_body
            client_socket.send(response.encode('utf8'))


server = MyServer('0.0.0.0', 9090)
server.run_forever()

運行結果:
image.png
image.png
image.png

配套視頻

Leave a Reply

Your email address will not be published. Required fields are marked *