由於無論是django也好 市場上最火的什麼MVC框架也好他就是基於這一套東西,來給你進行一些功能的封裝讓你用着特別方便,咱們要作的不止是學會這些框架學框架的時候要有本身的想法,要知道這個框架的這個地方本身好像試着作也能作出來廢話很少說 鐵子 奧力給!!css
Web 應用框架,或者簡單的說是「Web 框架」,實際上是創建 web 應用的一種方式。從簡單的博客系統到複雜的富 AJAX 應用,web 上每一個頁面都是經過寫代碼來生成的。我發現不少人都熱衷於學習 web 框架技術,例如 Flask 或這 Django 之類的,可是不少人並不理解什麼是 web 框架,咱們須要理解 Web 如何「工做」的。爲此,我將深刻挖掘你在瀏覽器裏輸入一個 URL 按下 Enter 以後都發生了什麼。html
Web服務器是否是第一個名詞上來就讓你頭大了 你能夠這麼理解Web服務器他就是一箇中間層他負責處理客戶端和服務端之間交互的工做 那咱們能不能本身寫一個Web服務器 咱們都學過最簡單的python基於Socket的網絡通訊,在那裏邊咱們是否是寫一個客戶端只須要綁定一個端口 而後.listen就能夠了python
#簡單服務器
import socket
server = socket.socket()
ip_port = ('127.0.0.1',8080)
server.bind(ip_port)
server.listen()
while 1:
conn,addr = server.accept()
msg = conn.recv(1024).decode('utf-8')
print(msg)
conn.close()
這樣是否是咱們本身寫了一個‘服務端’, 咱們基於本身再寫一個客戶端就能夠訪問這個端口,那麼基於瀏覽器呢?咱們在瀏覽器url欄上輸入127.0.0.1/8080以後看會出現什麼web
首先咱們的客戶端打印了請求的信息那麼是否是說明瀏覽器能夠理解成一個別人寫好的客戶端呢?先不要着急咱們繼續看瀏覽器說什麼django
瀏覽器
瀏覽器告訴咱們咱們並無發送任何數據 這個合理可是咱們不發送數據最多不就是阻塞住嗎 爲何會報錯呢?服務器
這就引出了咱們的下一個話題 HTTP協議網絡
還記得咱們接受到的瀏覽器請求信息嗎 第一行是GET/ HTTP /1.1那麼這是什麼東西呢?你能夠暫時理解爲瀏覽器給咱們的要求 要求咱們用HTTP協議來給瀏覽器進行迴應框架
關於HTTP協議詳情可參見 http://www.javashuo.com/article/p-gupevnoh-by.htmlsocket
那麼咱們就知道了咱們按照HTTP協議來對他進行迴應不就行了
因此修改咱們的本身的服務器代碼
#可讓瀏覽器有反應的服務器
import socket
server = socket.socket()
ip_port = ('127.0.0.1',8080)
server.bind(ip_port)
server.listen()
while 1:
conn,addr = server.accept()
msg = conn.recv(1024).decode('utf-8')
print(msg)
conn.send('HTTP/1.1 200 OK/r/n/r/n') #爲何這麼發後面會給你們解釋到
conn.close()
而後繼續看咱們這樣了以後瀏覽器會有什麼反應呢
咱們的瀏覽器如今纔是阻塞住了 你能夠理解爲如今的瀏覽器是在 conn.recv()就是說他如今纔是等待這接收消息,那麼這個東西是否是能夠理解爲瀏覽器每一次收東西以前都會先收一個響應頭咱們就是給他發這麼一個響應頭他就默認開始接收狀態了
如今咱們發送一串字符串‘HELLO WEB’
#像級了web服務器的服務器
import socket
server = socket.socket()
ip_port = ('127.0.0.1',8080)
server.bind(ip_port)
server.listen()
while 1:
conn,addr = server.accept()
msg = conn.recv(1024).decode('utf-8')
print(msg)
conn.send('HTTP/1.1 200 OK\r\n\r\n')#爲何這麼發後面會給你們解釋到
conn.send(b'HELLO WEB') #字節流形式
conn.close()
效果如圖
如今咱們能夠接收到字符串了 那咱們的這個服務器是否是就是一個web服務器了對吧
這時有人問了 你連個頁面都沒有隻有字符串算什麼web服務器?
關於這個我們在進行最後一次擴展
#web服務器
import socket
server = socket.socket()
ip_port = ('127.0.0.1',8080)
server.bind(ip_port)
server.listen()
while 1:
conn,addr = server.accept()
msg = conn.recv(1024).decode('utf-8')
print(msg)
conn.send('HTTP/1.1 200 OK\r\n\r\n')#爲何這麼發後面會給你們解釋到
with open('index.html',mode='rb') as f:
data = f.read()
conn.send(data)
conn.close()
怎麼樣如今能夠說是個web框架了吧 只不過咱們沒什麼功能對吧?那就對了