wab框架
http協(xié)議
一、http簡介
? ? ?? 1.HTTP是一個(gè)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)。
? ? ? 2.HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。它于1990年提出,經(jīng)過幾年的使用與發(fā)展,得到不斷地完善和擴(kuò)展
? ? 3.HTTP協(xié)議工作于客戶端-服務(wù)端架構(gòu)為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務(wù)端即WEB服務(wù)器發(fā)送所有請(qǐng)求。Web服務(wù)器根據(jù)接收到的請(qǐng)求后,向客戶端發(fā)送響應(yīng)信息。
?
?
二、http協(xié)議的特點(diǎn)
? ? ? 1、簡單快速:客戶向服務(wù)器請(qǐng)求服務(wù)時(shí),只需傳送請(qǐng)求方法和路徑。請(qǐng)求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。
?
由于HTTP協(xié)議簡單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。
?
? ? ? 2、靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對(duì)象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
?
? ? ? 3.無連接:無連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。
?
? ? ? 4.無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力。
?
缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
三、http請(qǐng)求協(xié)議
1、http請(qǐng)求協(xié)議遵循以下格式
請(qǐng)求協(xié)議遵循以下格式:
? ? 請(qǐng)求首行;? ? //請(qǐng)求方式、請(qǐng)求路徑、協(xié)議和版本? ?如:GET? /index.html? ?http/127.0.0.1
? ?請(qǐng)求頭信息;? ? 請(qǐng)求頭名稱:請(qǐng)求頭內(nèi)容,即key:value格式
? 空行? :? ? ? ? ?用來用請(qǐng)求體分開
? 請(qǐng)求體:? ? ? GET 沒有請(qǐng)求體,POST有請(qǐng)求體
?
在http協(xié)議中最為常用的請(qǐng)求體是GET,與POST? ??
2.get的請(qǐng)求
GET /562f25980001b1b106000338.jpg HTTP/1.1 Host img.mukewang.com User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 Accept image/webp,image/*,*/*;q=0.8 Referer http://www.imooc.com/ Accept-Encoding gzip, deflate, sdch Accept-Language zh-CN,zh;q=0.8 View CodeHTTP默認(rèn)的請(qǐng)求方法就是GET
? ? ?* 沒有請(qǐng)求體
? ? ?* 數(shù)據(jù)量有限制!
? ? ?* GET請(qǐng)求數(shù)據(jù)會(huì)暴露在瀏覽器的地址欄中
GET請(qǐng)求常用的操作:
? ? ? ?1. 在瀏覽器的地址欄中直接給出URL,那么就一定是GET請(qǐng)求
? ? ? ?2. 點(diǎn)擊頁面上的超鏈接也一定是GET請(qǐng)求
? ? ? ?3. 提交表單時(shí),表單默認(rèn)使用GET請(qǐng)求,但可以設(shè)置為POST
請(qǐng)求頭
?
1、Host請(qǐng)求的web服務(wù)器域名地址2、User-AgentHTTP客戶端運(yùn)行的瀏覽器類型的詳細(xì)信息。通過該頭部信息,web服務(wù)器可以判斷出http請(qǐng)求的客戶端的瀏覽器的類型。3、Accept指定客戶端能夠接收的內(nèi)容類型,內(nèi)容類型的先后次序表示客戶都接收的先后次序4、Accept-Lanuage指定HTTP客戶端瀏覽器用來展示返回信息優(yōu)先選擇的語言5、Accept-Encoding指定客戶端瀏覽器可以支持的web服務(wù)器返回內(nèi)容壓縮編碼類型。表示允許服務(wù)器在將輸出內(nèi)容發(fā)送到客戶端以前進(jìn)行壓縮,以節(jié)約帶寬。 而這里設(shè)置的就是客戶端瀏覽器所能夠支持的返回壓縮格式。6、Accept-CharsetHTTP客戶端瀏覽器可以接受的字符編碼集7、Content-Type顯示此HTTP請(qǐng)求提交的內(nèi)容類型。一般只有post提交時(shí)才需要設(shè)置該屬性有關(guān)Content-Type屬性值有如下兩種編碼類型:(1)“application/x-www-form-urlencoded”: 表單數(shù)據(jù)向服務(wù)器提交時(shí)所采用的編碼類型,默認(rèn)的缺省值就是“application/x-www-form-urlencoded”。然而,在向服務(wù)器發(fā)送大量的文本、包含非ASCII字符的文本或二進(jìn)制數(shù)據(jù)時(shí)這種編碼方式效率很低。(2)“multipart/form-data”: 在文件上載時(shí),所使用的編碼類型應(yīng)當(dāng)是“multipart/form-data”,它既可以發(fā)送文本數(shù)據(jù),也支持二進(jìn)制數(shù)據(jù)上載。當(dāng)提交為表單數(shù)據(jù)時(shí),可以使用“application/x-www-form-urlencoded”;當(dāng)提交的是文件時(shí),就需要使用“multipart/form-data”編碼類型。3.post請(qǐng)求
POST / HTTP1.1 Host:www.wrox.com User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022) Content-Type:application/x-www-form-urlencoded Content-Length:40 Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley?
?
http響應(yīng)協(xié)議
三、響應(yīng)格式
1.HTTP響應(yīng)也由四個(gè)部分組成,分別是:狀態(tài)行、消息報(bào)頭、空行和響應(yīng)正文。
復(fù)制代碼 HTTP/1.1 200 OK Date: Fri, 22 May 2009 06:07:21 GMT Content-Type: text/html; charset=UTF-8<html><head></head><body><!--body goes here--></body> </html>第一部分:狀態(tài)行,由HTTP協(xié)議版本號(hào), 狀態(tài)碼, 狀態(tài)消息 三部分組成。
第一行為狀態(tài)行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態(tài)碼為200,狀態(tài)消息為(ok)
第二部分:消息報(bào)頭,用來說明客戶端要使用的一些附加信息
第二行和第三行為消息報(bào)頭,
Date:生成響應(yīng)的日期和時(shí)間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8
第三部分:空行,消息報(bào)頭后面的空行是必須的
第四部分:響應(yīng)正文,服務(wù)器返回給客戶端的文本信息。
空行后面的html部分為響應(yīng)正文。
2.響應(yīng)狀態(tài)嗎
?
狀態(tài)代碼有三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別,共分五種類別: 1xx:指示信息--表示請(qǐng)求已接收,繼續(xù)處理 2xx:成功--表示請(qǐng)求已被成功接收、理解、接受 3xx:重定向--要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作 4xx:客戶端錯(cuò)誤--請(qǐng)求有語法錯(cuò)誤或請(qǐng)求無法實(shí)現(xiàn) 5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求常見狀態(tài)碼:200 OK //客戶端請(qǐng)求成功 400 Bad Request //客戶端請(qǐng)求有語法錯(cuò)誤,不能被服務(wù)器所理解 401 Unauthorized //請(qǐng)求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用 403 Forbidden //服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù) 404 Not Found //請(qǐng)求資源不存在,eg:輸入了錯(cuò)誤的URL 500 Internal Server Error //服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤 503 Server Unavailable //服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能恢復(fù)正常 復(fù)制代碼?
四、get與post請(qǐng)求區(qū)別
?
GET請(qǐng)求GET /books/?sex=man&name=Professional HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive注意最后一行是空行 POST請(qǐng)求POST / HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 40 Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley?
? ?? ? ? ? 1、? 在客戶端,Get方式在通過URL提交數(shù)據(jù),數(shù)據(jù)在URL中可以看到;POST方式,數(shù)據(jù)放在HTTP包的body中。
? ? ? ? ?2、 GET方式提交的數(shù)據(jù)大小有限制(因?yàn)闉g覽器對(duì)URL的長度有限制),而POST則沒有此限制。
? ? ? ? 3、安全性問題。正如在(1)中提到,使用 Get 的時(shí)候,參數(shù)會(huì)顯示在地址欄上,而 Post 不會(huì)。所以,如果這些數(shù)據(jù)是中文數(shù)據(jù)而且是非敏感數(shù)據(jù),那么使用 get;如果用戶輸入的數(shù)據(jù)不是中文字符而且包含敏感數(shù)據(jù),那么還是使用 post為好。
????? 4.、服務(wù)器取值方式不一樣。GET方式取值,如php可以使用$_GET來取得變量的值,而POST方式通過$_POST來獲取變量的值。
web應(yīng)用與web框架
對(duì)于所有的Web應(yīng)用,本質(zhì)上其實(shí)就是一個(gè)socket服務(wù)端,用戶的瀏覽器其實(shí)就是一個(gè)socket客戶端。
?
import socketdef handle_request(client):buf = client.recv(1024)client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8"))client.send("<h1 style='color:red'>Hello, yuan</h1>".encode("utf8"))def main():sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.bind(('localhost',8001))sock.listen(5)while True:connection, address = sock.accept()handle_request(connection)connection.close()if __name__ == '__main__':main()?
wsgiref模塊
from wsgiref.simple_server import make_serverdef application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return [b'<h1>Hello, web!</h1>']httpd = make_server('', 8080, application)print('Serving HTTP on port 8000...') # 開始監(jiān)聽HTTP請(qǐng)求: httpd.serve_forever()創(chuàng)建一個(gè)自己的框架
manage.py
import wsgi print("server is working...") wsgi.s.serve_forever()urls
?
from app01 import views# 路徑與邏輯函數(shù)的映射關(guān)系 URLpattern= (("/login", views.login),("/auth", views.auth),("/reg", views.reg),("/reg_auth", views.reg_auth) )?
views
?
def login(environ):with open("template/login.html", "rb") as f:data = f.read()return datadef auth(environ):print("QUERY_STRING", environ.get("QUERY_STRING")) # user=yuan&pwd=123useron, pwdon = environ.get("QUERY_STRING").split("&")_, user = useron.split("=")_, pwd = pwdon.split("=")import pymysql# 連接數(shù)據(jù)庫# conn = pymysql.connect(host='', port=3306, user='root', passwd='', db='s6') # db:庫名conn = pymysql.connect(host='localhost', user='root', password='123', database='s6')# 創(chuàng)建游標(biāo)cur = conn.cursor()SQL = "select * from userinfo WHERE NAME ='%s' AND PASSWORD='%s'" % (user, pwd)cur.execute(SQL)if cur.fetchone():with open("template/backend.html", "r") as f:data = f.read()data = data % userreturn data.encode("utf8")else:with open("template/login.html", "rb") as f:data = f.read()return datadef reg(environ):with open("template/reg.html", "rb") as f:data = f.read()return datadef reg_auth(environ):print("QUERY_STRING", environ.get("QUERY_STRING"))useron, pwdon ,repeat_pwdon= environ.get("QUERY_STRING").split("&")_,user= useron.split("=")_,pwd = pwdon.split("=")_,repeat_pwd = repeat_pwdon.split("=")print(user,pwd,repeat_pwd)if repeat_pwd==pwd:import pymysqlconn = pymysql.connect(host='localhost', user='root', password='123', database='s7')cur = conn.cursor()SQL="insert into userinfo1(name,password) values('%s','%s')"%(user,pwd)cur.execute(SQL)conn.commit()with open("template/login.html","rb") as f:data = f.read()return dataelse:with open("template/reg.html","rb") as f:data = f.read()return data?
models
?
import pymysql #連接數(shù)據(jù)庫 # conn = pymysql.connect(host='localhost',port= 3306,user = 'root',password='123',db='s6') #db:庫名 conn=pymysql.connect(host='localhost',user='root',password='123',database='s7') #創(chuàng)建游標(biāo) cur = conn.cursor()# sql=''' # create table userinfo( # id INT PRIMARY KEY , # name VARCHAR(32) , # password VARCHAR(32) # ) # # # ''' sql=''' create table userinfo1(id INT PRIMARY KEY auto_increment,name VARCHAR(32) ,password VARCHAR(32) )'''cur.execute(sql)# cur.executemany("insert into userinfo values(%s,%s,%s)", [(1,"yuan","123"), # (2,"alex","456"), # (3,"egon","789")]) cur.executemany("insert into userinfo1 values(%s,%s,%s)", [(1,"yuan","123"),(2,"alex","456"),(3,"egon","789")]) conn.commit() #關(guān)閉指針對(duì)象 cur.close() #關(guān)閉連接對(duì)象 conn.close()?
wsgi
?
from wsgiref.simple_server import make_serverimport urlsdef application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])print("environ",environ)print("path",environ.get("PATH_INFO")) # /login path=environ.get("PATH_INFO") # /auth URLpattern=urls.URLpatternprint("URLpattern",URLpattern)func=Nonefor item in URLpattern:if path==item[0]:func=item[1]breakif func:return [func(environ)]else:return [b"<h1>404</h1>"]s=make_server("127.0.0.1",8083,application)?
?重點(diǎn)
web框架:wsgiref模塊的使用from wsgiref.simple_server import make_serverdef application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return [b'<h1>Hello, web!</h1>']httpd = make_server('', 8080, application)print('Serving HTTP on port 8000...')# 開始監(jiān)聽HTTP請(qǐng)求:httpd.serve_forever() wsgiref模塊的使用(重點(diǎn):背會(huì))?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/mengqingjian/p/7701358.html
總結(jié)
- 上一篇: [cf797c]Minimal stri
- 下一篇: java实现自动登录,并获取数据