python django基礎一web框架的本質
web框架的本質就是一個socket服務端,而瀏覽器就是一個socker客戶端,基於請求做出相應,客戶端先請求,服務器做出對應響應
按照http協議的請求發送,服務器按照http協議來相應,這樣的通信就可以自己實現web框架了
簡單web框架
import socket server = socket.socket() server.bind((‘127.0.0.1‘, 8080)) # 把地址綁到套接字 server.listen() # 監聽鏈接 while 1: conn, addr = server.accept() # 接受客戶端連接 from_b_msg = conn.recv(1024).decode(‘utf-8‘) # 接收客戶端信息 print(from_b_msg) path = from_b_msg.split(‘\r\n‘)[0].split()[1] # 賽選到客戶端的第一行信息 conn.send(b‘HTTP/1.1 200 ok\r\n\r\n‘) # http響應格式 1.狀態行 回車符 換行符 2.相應頭部頭部字段:值 回車符 換行符 回車符 換行符響應正文 # conn.send(b‘hello‘) if path == ‘/‘: # 只寫這一個 你會發現 該 網頁css js 應用都沒應用上 因為他們 請求/test.css /timg.jpgwith open(‘test.html‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() elif path == ‘/test.css‘: with open(‘test.css‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() elif path == ‘/timg.jpg‘: with open(‘timg.jpg‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() elif path == ‘/test.js‘: with open(‘test.js‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() elif path == ‘/meinv.ico‘: with open(‘meinv.ico‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close()
test.html
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 上述3個meta標簽*必須*放在最前面,任何其他內容都*必須*跟隨其後! --> <title>Bootstrap 101 Template</title> <link rel="stylesheet" href="test.css"> <link rel="icon" href="meinv.ico"> <!-- Bootstrap --> <!--<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">--> <style> </style> </head> <body> <h1>來首詩,菩提本無樹,明鏡亦非臺</h1> <!--<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1550637152712&di=1caeff14731881d6d2ad4d9681ad031a&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F0b55b319ebc4b7454d716709c5fc1e178b8215c3.jpg" >--> <img src="timg.jpg" alt=""> <!--<script src="jquery.js"></script>--> <!--<script src="bootstrap/js/bootstrap.min.js"></script>--> <!--<script>--> <!--alert(‘xxx‘);--> <!--</script>--> <script src="test.js"></script> </body> </html>
test.css
h1{ background-color: green; } img{ width: 200px; height: 200px; }
test.js
alert(‘xxx‘);
這2個圖片 我就不提供了
timg.jpg
meinv.ico
超文本傳輸協議(英文:HyperText Transfer Protocol,縮寫:HTTP)
HTTP是一個客戶端終端(用戶)和服務器端(網站)請求和應答的標準(TCP)。
工作原理
1.客戶端到連接服務器
一個HTTP客戶端,通常是瀏覽器,與Web服務器的HTTP端口(默認為80)建立一個TCP套接字連接:如http://www.baidu.com
2.發送http請求
通過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。
URL包含:/index/index2?a=1&b=2;路徑和參數都在這裏。
3.服務接收請求並返回http響應
Web服務器解析請求,定位請求資源。服務器將資源復本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分組成。
4.釋放連接tcp連接
若connection 模式為close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;
5.客戶端瀏覽器解析HTML內容
客戶端瀏覽器首先解析狀態行,查看表明請求是否成功的狀態代碼。然後解析每一個響應頭,響應頭告知以下為若幹字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在瀏覽器窗口中顯示。
只加根判斷應答會出現 下面情況
請求方式: get與post請求(通過form表單我們自己寫寫看)
- GET提交的數據會放在URL之後,也就是請求行裏面,以?分割URL和傳輸數據,參數之間以&相連,如EditBook?name=test1&id=123456.(請求頭裏面那個content-type做的這種參數形式,後面講) POST方法是把提交的數據放在HTTP包的請求體中.
- GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
- GET與POST請求在服務端獲取請求數據方式不同,就是我們自己在服務端取請求數據的時候的方式不同了,這句廢話昂。
http狀態碼
- 1xx消息——請求已被服務器接收,繼續處理
- 2xx成功——請求已成功被服務器接收、理解、並接受
- 3xx重定向——需要後續操作才能完成這一請求
- 4xx請求錯誤——請求含有詞法錯誤或者無法被執行
- 5xx服務器錯誤——服務器在處理某個正確請求時發生錯誤
高級點的 web框架
from threading import Thread import socket server = socket.socket() server.bind((‘127.0.0.1‘, 8080)) server.listen() def html(conn): with open(‘test.html‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() def js(conn): with open(‘test.js‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() def css(conn): with open(‘test.css‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() def img(conn): with open(‘timg.jpg‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() def ico(conn): with open(‘meinv.ico‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() url = [ (‘/‘, html), (‘/test.css‘, css), (‘/timg.jpg‘, img), (‘/test.js‘, js), (‘/meinv.ico‘, ico), ] while 1: conn, addr = server.accept() from_b_msg = conn.recv(1024).decode(‘utf-8‘) path = from_b_msg.split(‘\r\n‘)[0].split(‘ ‘)[1] conn.send(b‘HTTP/1.1 200 ok\r\nk1:v1\r\n\r\n‘) for i in url: if i[0] == path: t=Thread(target=i[1],args=(conn,)) t.start()
python django基礎一web框架的本質