HTTP協議簡介:HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用于萬維網(www.world wide web)服務器與本地瀏覽器之間傳輸文本的傳輸協議。
http請求協議與相應協議HTTP協議包含瀏覽器發送數據到服務器需要遵循的請求協議與服務器發送數據到瀏覽器需要遵循的請求協議。用于HTTP協議交互的信被稱為報文。請求端的HTTP報文做請求報文,服務端做響應報文。HTTP協議特性:(1)基于TCP/IPHTTP協議是基于TCP/IP協議之上的應用層協議。(2)基于請求-響應模式HTTP協議規定:請求從客戶端發出,最后服務器端響應請求并返回。換句話說,肯定是先從客戶端開始建立通信的,服務器端在沒有收到請求之前不會發送響應。HTTP協議是一種無狀態短鏈接協議。是基于TCP/IP協議的應用層協議。一次請求一次響應。
?
請求協議:
請求格式:
請求協議包括:請求首行:請求方式 url 請求協議版本號請求頭 : key:value請求體 :里面放數據。
總結:
a.請求協議由請求首行和請求頭、請求體組成。
b.請求首行是由:請求方式(GET/POST) HTTP協議(HTTP/1.1) 請求IP地址
c.請求首行與請求頭之間用一個\r\n隔開,請求頭和請求體之間用兩個(\r\n\r\n)隔開(每個請求頭之間用一個\r\n隔開)
d.Cookie:也放在請求頭中。
如果要保持連接,設置成長連接,可以加一個請求頭(服務器客戶端都要設置):Connection:keep-alive 服務器和客戶端都要設置
?
請求方式: get與post請求
在服務端的存放位置:get 提交的數據會放在url(路徑)之后,以?分割url和傳輸數據,參數之間以&相連,(一般服務端收到數據是在請求首行中。)post提交的數據會放在HTTP的請求體當中。
小結:GET請求的數據是放在請求首行中的:跟在請求方式后面。 所以請求首航:GET/POST 請求路徑 /r/n請求地址 如果是在form表單中發送了GET請求的話,所填的數據會以xx%&xx=xx的格式掛在URL之后的。POST請求的數據是放在請求體中的:儲存格式是以xx=xx%&xx=xx的格式儲存的。
?
?
?
響應協議:
相應協議包括:相應首行: 協議版本(HTTP://1.1) 狀態碼(200) OK(狀態碼的原因短句)\r\n響應頭:Content-Length: 363Content-Type: text/html。。。 響應體:服務端發給客戶端的數據。
響應狀態碼
狀態碼的值是當客戶端向服務器端發送請求時,返回的請求結果。借助狀態碼,用戶可以知道服務器端是否正常請求還是出現了狀態嗎200 ok ,以3位數字和原因組成。
?
?
代碼演示:
?
?
?
?
?
wsgiref的作用
WSGI(Web Server Gateway Interface):
wsgiref模塊,是python基于WSGI協議開發的服務模塊。最簡單的Web應用,就是先把HTML用文件保存好。
用一個現成的HTTP服務器軟件,接受用戶請求,從文件中讀取HTML,返回給客戶端。但是,接收HTML請求,解析HTML請求,發送HTML請求都比較費時,所以這些都可以交給基于WSGI協議的wsgiref模塊來完成。
我們只需要專注于用python生成HTML文檔。
?
?
from wsgiref.simple_server import make_serverdef application(environ,start_response):start_response('200 OK',([('Content-Type','text/html')]))return [b"<a href='http://www.baidu.com'>baidu</a>"] // 給客戶端返回的數據// 接受請求的端口和IP地址,默認為本機地址,如果收到客戶端請求,執行application函數
httpd = make_server('',8000,application)// 夯住,等待客戶端發送請求
httpd.serve_forever()如果打印environ:
ctrl+f:"PATH_INFO"
打印請求路徑:path=environ.get('PATH_INFO')print(path)
//默認是‘/’根路徑。這樣就可以在application函數中判斷,如果path==‘/login/’,就給客戶端返回一段login.html字符串,
如果path=='/index/',就給他返回首頁的index.html字符串.**********************定義路徑*******************************
urlpatterns = [('/login/',login),('/index/',index),('/reg/',reg)
]
可以定義一個列表,列表中寫路徑與函數的對應關系,走到對應的路徑,執行對應的函數。
函數可以定義。
// 獲取用戶訪問的url
current_path = environ.get('PATH_INFO')func = None
for key,item in urlpatterns:if key == 'current_path':func = itembreak//匹配上URL,執行對應函數,返回相應的html頁面,否則返回404沒有找的頁面
if func:ret = func()return [ret]
else:return [b"<h1>404</h1>"]//優化代碼,可以將所有的函數放到views文件中。//url也可以放到urls文件中。//在創建一個templates文件夾單存html文件。
?
?
?
?
?