本文來自於千鋒教育在阿里雲開發者社區學習中心上線課程《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後控制檯輸出了訪問的路徑:
接下來我們可以通過這個信息來定製不同的 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 = '對不起,您要查看的頁面不存在!!!'
可以在瀏覽其中訪問效果如下:
面向對象的服務器封裝
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()
運行結果: