在學習自定義web框架以前咱們對什麼是web框架須要有個清晰的認識,本質上說,web框架就是一個socket Server。html
目前常見的動態網站WEB框架前面有WSGI(eg:Django、Flask...)或者是本身寫的SOCKET(Tornado),而後交給URL路由系統處理,而後交給某個函數或某個類,而後在模板(經常使用jinja2)裏拿到模板而後把模板和從數據庫取出的數據進行混合組成一個字符串而後返回給用戶(python3在發送時要byte編碼)。python
這裏對WSGI舉例說明一下:web
WSGI是用來接收請求,而後封裝請求。例如對Django來講都封裝到了request裏面。數據庫
一、web框架雛形之socket實現框架
1 #!/usr/bin/env python 2 # -*- coding:utf8 -*- 3 4 import socket 5 6 7 def handle_request(client): 8 buf = client.recv(1024) 9 client.send(b"HTTP/1.1 200 OK \r\n\r\n")
10 # with open('./html/index.html','r') as f: #執行時這裏報錯 錯誤詳情下文有說明 11 with open('./html/index.html', 'rb') as f: 12 client.send(f.read()) 13 14 15 def main(): 16 ip_port = ('127.0.0.1',9999) 17 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 18 sock.bind(ip_port) 19 sock.listen() 20 21 while True: 22 conn, addr = sock.accept() 23 handle_request(conn) 24 conn.close() 25 26 27 if __name__ == '__main__': 28 print("\033[31;1m Server is running... \033[0m") 29 main()
在這裏遇到一個小問題,pycharm執行報錯:異步
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 84: illegal multibyte sequence
解決辦法:socket
(1)修改打開文件方式爲 'rb'函數
with open('./html/index.html', 'rb') as f: client.send(f.read())
(2)在打開時設置編碼學習
with open('./html/index.html', 'r',encoding='utf-8') as f: client.send(f.read())
2基於socket的web框架網站
這種實現方式的web框架主要有Tornado。這裏socket是屬於web框架。Tornado由於本身寫socket,利用epoll實現了異步非阻塞。
三、基於WSGI的web框架
目前主流的部分web框架,如Django、Flask...都是採用這樣的方式。這裏WSGI與web框架是平行關係(WSGI不屬於web框架)。