純手寫web框架

朱饱饱發表於2024-03-15

純手寫web框架

.py



#你可以將web框架理解成服務端
import socket

server=socket.socket() #TCP 三次握手 osi七層
server.bind(('127.0.0.1',8081)) #IP協議 乙太網協議 arp協議
server.listen(5) #池。。。

while True:
conn,addr=server.accept()#等待監聽
data=conn.recv(1024)
print(data)
#回了兩次,直接忽略favicon.ico
data=data.decode('utf-8') #將二進位制轉為字串
conn.send(b'HTTP/1.1 200 OK\r\n\r\n') #遵循http協議
current_path=data.split(' ')[1] #想拿到路徑,根據空格進行切分取索引[1]的位置就是路徑
# print(current_path)
if current_path=='/index': #不同路徑傳送不同效果
# conn.send(b'index heiheihei')
with open(r'01 myhtml.html','rb')as f:
conn.send(f.read())
elif current_path=='/login':
conn.send(b'login')
else:
conn.send(b'hello web')
conn.close() #關閉

將二進位制轉為字串:

data=date.decode('utf-8')

myhtml.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>你好呀 齊老師^V^ </h1>
</body>
</html>

基於wsgiref模組:

import wsgiref

def run(env,response):
    """

    :param env:是請求相關的所有資料
    :param response:響應相關的所有資料
    :return:返回給瀏覽器的資料
    """
    print(env) #大字典 wsgiref模組幫你處理好了http的格式
    #從env中取值
    current_path=env.get('PATH_INFO')#拿到當前使用者輸入的物件路徑
    if current_path=='/index':
        return [b'index']
    elif current_path=='/login':
        return [b'login']
    return [b'404 error']
    response('200 OK',[])#響應首行響應頭
    return[b'hello wsgiref']




if __name__=='__main__':
    server=make_server('127.0.0.1',8080,run)
    """
    會實時監聽127.0.0.1:8080地址,只要有客戶來了
    都會交給run函式處理(加括號出發run函式的執行)
    
    flask啟動程式碼
    make_server('127.0.0.1,8080,obj)
    __call__物件加()會執行它的call方法
    """
    server.server_forever()

相關文章