標籤:分類 根據 djang alt 應該 接收 二進位 技術 ali
你會發現,運行程式之後並且用瀏覽器訪問 127.0.0.1:8001 ,程式會報錯,瀏覽器顯示“該網頁無法正常運作”,如
4. 釋放串連TCP串連
若connection 模式為close,則伺服器主動關閉TCP串連,用戶端被動關閉串連,釋放TCP串連;若connection 模式為keepalive,則該串連會保持一段時間,在該時間內可以繼續接收請求;
5. 用戶端瀏覽器解析HTML內容
用戶端瀏覽器首先解析狀態行,查看錶明請求是否成功的狀態碼。然後解析每一個回應標頭,回應標頭告知以下為若干位元組的HTML文檔和文檔的字元集。用戶端瀏覽器讀取響應資料HTML,根據HTML的文法對其進行格式化,並在瀏覽器視窗中顯示。
HTTP響應報文格式:
這時候,在瀏覽器上面就可以看到正確的頁面了,並且可以調出Chrome的開發人員工具查看到我們傳過來的HTTP響應格式。
根據不同的路徑返回不同的內容
細心的你可能會發現,現在無論我們輸出什麼樣的路徑,只要保持 IP 和連接埠號碼不變,瀏覽器頁面顯示的都是同樣的內容,這不太符合我們日常的使用情境。
如果我想根據不同的路徑返回不同的內容,應該怎麼辦呢?
這時候就需要我們把伺服器收到的請求報文進行解析,讀取到其中的訪問路徑。
觀察收到的HTTP請求,會發現,它們的請求行、要求標頭部、請求資料是以 \r\n 進行分隔的,所以我們可以根據 \r\n 對收到的請求進行分隔,取出我們想要的訪問路徑。
這時候,我們訪問不同的路徑,例如 http://127.0.0.1:8001/yimi/ http://127.0.0.1:8001/xiaohei/ 會在瀏覽器上顯示不一樣的內容
可以看到,我們現在的程式邏輯不是很清晰,我們可以改一下,url 用一個列表存起來,url 對應的響應分別寫成一個個函數,通過函數調用進行 url 訪問,你會發現,這跟某個架構的處理方式很像很像(偷笑罒ω罒~~~)
返回具體的 HTML 頁面
現在,你可能會在想,目前我們想要返回的內容是通過函數進行返回的,返回的都是一些簡單地位元組,如果我想要返回一個已經寫好的精美的 HTML 頁面應該怎麼辦呢?
我們可以把寫好的 HTML 頁面以二進位的形式讀取進來,返回給瀏覽器,瀏覽器再進行解析,這就可以啦!
返回動態超文字標記語言 頁面
這時候,你可能又會納悶,現在返回的都是些靜態、固定的 HTML 頁面,如果我想返回一個動態 HTML 頁面,應該怎麼辦?
動態網頁,本質上都是字串的替換,字串替換髮生服務端,替換完再返回給瀏覽器。
這裡,我們通過返回一個目前時間,來類比動態超文字標記語言 頁面的返回過程。
可以看到,現在我們每一次訪問 yimi 頁面,都會返回一個目前時間。
小結一下
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 輕量級
你會發現,使用了 wsgiref 模組之後,程式封裝更好了,代碼邏輯也更加清晰了。
下節預告
到了這裡,相信聰明的你已經理解清楚整個 瀏覽器 伺服器的訪問過程,並且 socket 服務端功能劃分有了清晰的認知。
歡迎大家關注我的公眾號:Python學習交流
歡迎加入千人交流答疑基地群:125240963
如何才能做到學Python從入門到精通!而不是入門到放棄!攻略送你