Pyhton學習——Day50

#HTTP協議# 又是轉載:http://www.cnblogs.com/yuanchenqi/articles/6000358.html# 一 HTTP概述# HTTP(hypertext transport protocol),即超文本傳輸協議。這個協議詳細規定了瀏覽器和萬維網服務器之間互相通訊的規則。# 特色:# HTTP叫超文本傳輸協議,基於請求/響應模式的!# HTTP是無狀態協議。# URL:統一資源定位符,就是一個網址:協議名://域名:端口/路徑,eg:http://www.oldboy.cn:80/index.html#——————————————————————————————————————————————————————## 二 請求協議# 請求首行;  // 請求方式 請求路徑 協議和版本,例如:GET /index.html HTTP/1.1# 請求頭信息;// 請求頭名稱:請求頭內容,即爲key:value格式,例如:Host:localhost# 空行;     // 用來與請求體分隔開# 請求體。   // GET沒有請求體,只有POST有請求體。#瀏覽器發送給服務器的內容就這個格式的,若是不是這個格式服務器將沒法解讀!# 在HTTP協議中,請求有不少請求方法,其中最爲經常使用的就是GET和POST。# 2.1 GET請求# HTTP默認的請求方法就是GET#      * 沒有請求體#      * 數據必須在1K以內!#      * GET請求數據會暴露在瀏覽器的地址欄中# GET請求經常使用的操做:#        1. 在瀏覽器的地址欄中直接給出URL,那麼就必定是GET請求#        2. 點擊頁面上的超連接也必定是GET請求#        3. 提交表單時,表單默認使用GET請求,但能夠設置爲POST# GET 127.0.0.1:8090/login  HTTP/1.1:GET請求,請求服務器路徑爲  127.0.0.1:8090/login ,協議爲1.1;# Host:localhost:請求的主機名爲localhost;# *User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0:與瀏覽器和OS相關的信息。# 有些網站會顯示用戶的系統版本和瀏覽器版本信息,這都是經過獲取User-Agent頭信息而來的;#  Accept: text/html,application/xhtml+xml,application/xml;# q=0.9,*/*;q=0.8:告訴服務器,當前客戶端能夠接收的文檔類型,其實這裏包含了*/*,就表示什麼均可以接收;# Accept-Language: zh-cn,zh;q=0.5:當前客戶端支持的語言,能夠在瀏覽器的工具?選項中找到語言相關信息;# Accept-Encoding: gzip, deflate:支持的壓縮格式。數據在網絡上傳遞時,可能服務器會把數據壓縮後再發送;# Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7:客戶端支持的編碼;# Connection: keep-alive:客戶端支持的連接方式,保持一段時間連接,默認爲3000ms;# Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98:由於不是第一次訪問這個地址,# 因此會在請求中把上一次服務器響應中發送過來的Cookie在請求中一併發送去過;這個Cookie的名字爲JSESSIONID。#——————————————————————————————————————————————————————## HTTP無狀態:無狀態是指協議對於事務處理沒有記憶能力,服務器不知道客戶端是什麼狀態。從另外一方面講,打開一個服務器上的網頁# 和你以前打開這個服務器上的網頁之間沒有任何聯繫# 若是你要實現一個購物車,須要藉助於Cookie或Session或服務器端API(如NSAPI and ISAPI)記錄這些信息,# 請求服務器結算頁面時同時將這些信息提交到服務器# 當你登陸到一個網站時,你的登陸狀態也是由Cookie或Session來「記憶」的,由於服務器並不知道你是否登陸# 優勢:服務器不用爲每一個客戶端鏈接分配內存來記憶大量狀態,也不用在客戶端失去鏈接時去清理內存,以更高效地去處理WEB業務# 缺點:客戶端的每次請求都須要攜帶相應參數,服務器須要處理這些參數## 容易犯的誤區:# 一、HTTP是一個無狀態的面向鏈接的協議,無狀態不表明HTTP不能保持TCP鏈接,更不能表明HTTP使用的是UDP協議(無鏈接)# 二、從HTTP/1.1起,默認都開啓了Keep-Alive,保持鏈接特性,簡單地說,當一個網頁打開完成後,客戶端和服務器之間用於傳輸# HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接# 三、Keep-Alive不會永久保持鏈接,它有一個保持時間,能夠在不一樣的服務器軟件(如Apache)中設定這個時間#——————————————————————————————————————————————————————## 2.2 POST請求# (1). 數據不會出如今地址欄中# (2). 數據的大小沒有上限# (3). 有請求體# (4). 請求體中若是存在中文,會使用URL編碼!# username=%E5%BC%A0%E4%B8%89&password=123# 咱們都知道Http協議中參數的傳輸是# "key=value"# 這種簡直對形式的,若是要傳多個參數就須要用「 & 」符號對鍵值對進行分割。如# "?name1=value1&name2=value2",這樣在服務端在收到這種字符串的時候,# 會用「 & 」分割出每個參數,而後再用「=」來分割出參數值。# 針對「name1 = value1 & name2 = value2」咱們來講一下客戶端到服務端的概念上解析過程:# 上述字符串在計算機中用ASCII嗎表示爲:# 6E616D65313D76616C756531266E616D65323D76616C756532。6E616D6531:name13D:=76616C756531:value126: &6E616D6532:name2# 3D:=76616C756532:value2# 服務端在接收到該數據後就能夠遍歷該字節流,# 首先一個字節一個字節的吃,當吃到3D這字節後,# 服務端就知道前面吃得字節表示一個key,再想後吃,若是遇到26,# 說明從剛纔吃的3D到26子節之間的是上一個key的value,以此類推就能夠解析出客戶端傳過來的參數。# 如今有這樣一個問題,若是個人蔘數值中就包含 = 或 & 這種特殊字符的時候該怎麼辦。# 好比說「name1 = value1」, 其中value1的值是「va & lu = e1」字符串,# 那麼實際在傳輸過程當中就會變成這樣「name1 = va & lu = e1」。# 咱們的本意是就只有一個鍵值對,可是服務端會解析成兩個鍵值對,這樣就產生了奇異。# 如何解決上述問題帶來的歧義呢?解決的辦法就是對參數進行URL編碼# URL編碼只是簡單的在特殊字符的各個字節前加上 %,# 例如,咱們對上述會產生奇異的字符進行URL編碼後結果:「name1 = va % 26lu % 3D」,# 這樣服務端會把緊跟在「 % 」後的字節當成普通的字節,就是不會把它當成各個參數或鍵值對的分隔符。# 爲何要進行URL編碼# 用表單能夠發POST請求,但表單默認是GET# <form action="" method="post">#   關鍵字:<input type="text" name="keyword"/>#   <input type="submit" value="提交"/># </form># POST請求是能夠有體的,而GET請求不能有請求體。# Referer: http://localhost:8080/hello/index.jsp:請求來自哪一個頁面,例如你在百度上點擊連接到了這裏,# 那麼Referer:http://www.baidu.com;若是你是在瀏覽器的地址欄中直接輸入的地址,那麼就沒有Referer這個請求頭了;# Content-Type: application/x-www-form-urlencoded:表單的數據類型,說明會使用url格式編碼數據;# url編碼的數據都是以「%」爲前綴,後面跟隨兩位的16進制。# Content-Length:13:請求體的長度,這裏表示13個字節。# keyword=hello:請求體內容!hello是在表單中輸入的數據,keyword是表單字段的名字。# Referer請求頭是比較有用的一個請求頭,它能夠用來作統計工做,也能夠用來作防盜鏈。# 統計工做:我公司網站在百度上作了廣告,但不知道在百度上作廣告對咱們網站的訪問量是否有影響,# 那麼能夠對每一個請求中的Referer進行分析,若是Referer爲百度的不少,那麼說明用戶都是經過百度找到咱們公司網站的。# 防盜鏈:我公司網站上有一個下載連接,而其餘網站盜鏈了這個地址,# 例如在我網站上的index.html頁面中有一個連接,點擊便可下載JDK7.0,# 但有某我的的微博中盜鏈了這個資源,它也有一個連接指向咱們網站的JDK7.0,# 也就是說登陸它的微博,點擊連接就能夠從我網站上下載JDK7.0,# 這致使咱們網站的廣告沒有看,但下載的倒是我網站的資源。這時可使用Referer進行防盜鏈,# 在資源被下載以前,咱們對Referer進行判斷,若是請求來自本網站,# 那麼容許下載,若是非本網站,先跳轉到本網站看廣告,而後再容許下載。#——————————————————————————————————————————————————————## 三 響應協議# 3.1 響應內容# 響應協議的格式以下:# 響應首行;# 響應頭信息;# 空行;# 響應體。# 響應內容是由服務器發送給瀏覽器的內容,瀏覽器會根據響應內容來顯示。# 遇到<img src=''>會開一個新的線程加載,因此有時圖片多的話,內容會先顯示出來,而後圖片才一張張加載出來。# HTTP/1.1 200 OK:響應協議爲HTTP1.1,狀態碼爲200,表示請求成功,OK是對狀態碼的解釋;# Server:WSGIServer/0.2 CPython/3.5.2:服務器的版本信息;# Content-Type: text/html;charset=UTF-8:響應體使用的編碼爲UTF-8;# Content-Length: 724:響應體爲724字節;# Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:響應給客戶端的Cookie;# Date: Wed, 25 Sep 2012 04:15:03 GMT:響應的時間,這可能會有8小時的時區差;# 3.2 狀態碼# 響應頭對瀏覽器來講很重要,它說明了響應的真正含義。例如200表示響應成功了,# 302表示重定向,這說明瀏覽器須要再發一個新的請求。# 200:請求成功,瀏覽器會把響應體內容(一般是html)顯示在瀏覽器中;# 404:請求的資源沒有找到,說明客戶端錯誤的請求了不存在的資源;# 500:請求資源找到了,但服務器內部出現了錯誤;# 302:重定向,當響應碼爲302時,表示服務器要求瀏覽器從新再發一個請求,# 服務器會發送一個響應頭Location,它指定了新請求的URL地址;# 304:當用戶第一次請求index.html時,服務器會添加一個名爲Last-Modified響應頭,這個頭說明了#   index.html的最後修改時間,瀏覽器會把index.html內容,以及最後響應時間緩存下來。當用戶第#   二次請求index.html時,在請求中包含一個名爲If-Modified-Since請求頭,它的值就是第一次請#   求時服務器經過Last-Modified響應頭髮送給瀏覽器的值,即index.html最後的修改時間,#   If-Modified-Since請求頭就是在告訴服務器,我這裏瀏覽器緩存的index.html最後修改時間是這個,#   您看看如今的index.html最後修改時間是否是這個,若是仍是,那麼您就不用再響應這個index.html#   內容了,我會把緩存的內容直接顯示出來。而服務器端會獲取If-Modified-Since值,與index.html#   的當前最後修改時間比對,若是相同,服務器會發響應碼304,表示index.html與瀏覽器上次緩存的相#   同,無需再次發送,瀏覽器能夠顯示本身的緩存頁面,若是比對不一樣,那麼說明index.html已經作了修#   改,服務器會響應200。# 3.3 其餘響應頭# 告訴瀏覽器不要緩存的響應頭:# Expires: -1;# Cache-Control: no-cache;# Pragma: no-cache;# 自動刷新響應頭,瀏覽器會在3秒以後請求http://www.baidu.com:# Refresh: 3;url=http://www.baidu.com# 3.4 HTML中指定響應頭# 在HTMl頁面中可使用<meta http-equiv="" content="">來指定響應頭,# 例如在index.html頁面中給出<meta http-equiv="Refresh" content="3;url=http://www.baidu.com">,# 表示瀏覽器只會顯示index.html頁面3秒,而後自動跳轉到http://www.baidu.com.#——————————————————————————————————————————————————————## 一 什麼是web框架?# 框架,即framework,特指爲解決一個開放性問題而設計的具備必定約束性的支撐結構,# 使用框架能夠幫你快速開發特定的系統,簡單地說,就是你用別人搭建好的舞臺來作表演。# 對於全部的Web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket客戶端。# 最簡單的Web應用就是先把HTML用文件保存好,用一個現成的HTTP服務器軟件,接收用戶請求,從文件中讀取HTML,返回。# 若是要動態生成HTML,就須要把上述步驟本身來實現。不過,接受HTTP請求、解析HTTP請求、發送HTTP響應都是苦力活,# 若是咱們本身來寫這些底層代碼,還沒開始寫動態HTML呢,就得花個把月去讀HTTP規範。# 正確的作法是底層代碼由專門的服務器軟件實現,# 咱們用Python專一於生成HTML文檔。# 由於咱們不但願接觸到TCP鏈接、HTTP原始請求和響應格式,# 因此,須要一個統一的接口,讓咱們專心用Python編寫Web業務。# 這個接口就是WSGI:Web Server Gateway Interface。#——————————————————————————————————————————————————————##二 MVC和MTV模式# 著名的MVC模式:所謂MVC就是把web應用分爲模型(M),控制器(C),視圖(V)三層;他們之間以一種插件似的,鬆耦合的方式鏈接在一塊兒。# 模型負責業務對象與數據庫的對象(ORM),視圖負責與用戶的交互(頁面),控制器(C)接受用戶的輸入調用模型和視圖完成用戶的請求。# Model(模型):負責業務對象與數據庫的對象(ORM)# Template(模版):負責如何把頁面展現給用戶# View(視圖):負責業務邏輯,並在適當的時候調用Model和Template# 此外,Django還有一個url分發器,它的做用是將一個個URL的頁面請求分發給不一樣的view處理,view再調用相應的Model和Template#——————————————————————————————————————————————————————## Django URL (路由系統)# URL配置(URLconf)就像Django 所支撐網站的目錄。# 它的本質是URL模式以及要爲該URL模式調用的視圖函數之間的映射表;# 你就是以這種方式告訴Django,對於這個URL調用這段代碼,對於那個URL調用那段代碼。# 參數說明:# 一個正則表達式字符串# 一個可調用對象,一般爲一個視圖函數或一個指定視圖函數路徑的字符串# 可選的要傳遞給視圖函數的默認參數(字典形式)# 一個可選的name參數# urlpatterns = [#     url(正則表達式, views視圖函數,參數,別名),# ]#——————————————————————————————————————————————————————## Django初步總結# Django的構成# Django的MTV模型組織#             瀏覽器         -->      Manage#               |#              WSGI          -->      Settings#               |#              Urls          -->      Apps#               |#              Views         -->      Tests#           /    |     \#     Models -模板語言- Templates#        |                 |#       ORM              static#        |#     數據庫# 總結# 安裝配置django運行的環境# 編寫模型,使用簡單API與數據庫交互# 使用django的後臺管理中維護數據# 經過視圖接收請求,經過模型獲取數據,展現出來# 調用模板完成展現
相關文章
相關標籤/搜索