1. 程式人生 > >python django基礎一web框架的本質

python django基礎一web框架的本質

pos 部分 數據大小 每一個 data mage styles port transfer

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(bHTTP/1.1 200 ok\r\n\r\n) # http響應格式 1.狀態行 回車符 換行符 2.相應頭部頭部字段:值 回車符 換行符 回車符 換行符響應正文 # conn.send(b‘hello‘) if path == /: # 只寫這一個 你會發現 該 網頁css js 應用都沒應用上 因為他們 請求/test.css /timg.jpg
with 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(bHTTP/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框架的本質