所有的web應用的本質就是一個socket服務端,而瀏覽器就是一個socket客戶端;
以前我們自己在電腦上寫的socket服務端和客戶端的通信,我們知道客戶端會向服務端發來什么格式的消息,然后我們用服務端去用相應的格式給接收它,其實兩者之間,是靠自己定的一個通信的協議。
而現在客戶端是用戶的瀏覽器了,因此還想使瀏覽器的客戶端與服務端進行通信,就必須要遵循HTTP協議了(本質上就是接收消息的格式要求)HTTP協議中現今廣泛使用的一個版本——HTTP 1.1。
有關於HTTP協議:
1.瀏覽器往服務端發的叫做 請求(request);
請求消息的格式:
請求方法 路徑 HTTP/1.1\r\n
k1:v1\r\n
k2:v2\r\n
\r\n
請求數據
HTTP請求方法通常有兩種;一是GET請求;二是PSOT請求;
GET請求:通常是請求服務端返回一個頁面(讀取數據);
PSOT請求:通常是表單提交數據;
2.服務端往瀏覽器發的叫 響應(response);
響應的格式:
HTTP/1.1 狀態碼 狀態描述符\r\n
k1:v1\r\n
k2:v2\r\n
\r\n
響應正文 <-- html的內容
HTTP的狀態碼
狀態代碼的第一個數字代表當前響應的類型:
- 1xx消息——請求已被服務器接收,繼續處理
- 2xx成功——請求已成功被服務器接收、理解、並接受
- 3xx重定向——需要后續操作才能完成這一請求
- 4xx請求錯誤——請求含有詞法錯誤或者無法被執行
- 5xx服務器錯誤——服務器在處理某個正確請求時發生錯誤
例如"200 OK","404 Not Found"
動態的網頁:
本質上都是字符串的替換
字符串替換發生在什么地方:
在服務端替換完再返回給瀏覽器!!!
一個完整得請求流程:
1.首先啟動服務端,等待客戶端(用戶的瀏覽器)來連接;
2.在瀏覽器的地址欄鍵輸入URL,按下回車鍵后就與服務端建立了連接,瀏覽器就向服務端發送了請求;
3.服務端接收到請求消息后,按照HTTP協議來解析消息;根據路徑和函數的對應關系,找到將要執行的函數;
4.執行函數,打開HTML文件,進行字符串的替換,得到一個最終要返回的HTML的內容;
5.按照HTTP協議的消息格式要求,把HTML內容回復給用戶的瀏覽器(這一動作就是發送響應);
6.瀏覽器收到響應的消息之后,就會按照HTML的規則來渲染頁面,把最終的頁面呈現個用戶的瀏覽器上;
總結:
1. web框架的本質:
socket服務端 與 瀏覽器的通信
2. socket服務端功能划分:
a. 負責與瀏覽器收發消息(socket通信) --> wsgiref/uWsgi/gunicorn...
b. 根據用戶訪問不同的路徑執行不同的函數
c. 從HTML讀取出內容,並且完成字符串的替換 --> jinja2(模板語言)
3. Python中 Web框架的分類:
1. 按上面三個功能划分:
1. 框架自帶a,b,c --> Tornado
2. 框架自帶b和c,使用第三方的a --> Django
3. 框架自帶b,使用第三方的a和c --> Flask
2. 按另一個維度來划分:
1. Django --> 大而全(你做一個網站能用到的它都有)
2. 其他 --> Flask 輕量級