Django基礎之request對象

當一個頁面被請求時,django就會建立一個包含本次請求原信息的HttpRequest對象。<br> django會將這個對象自動傳遞給響應的視圖函數,通常視圖函數約定俗成地使用request參數承接這個對象。java

<h2>1. 請求相關的經常使用值</h2> <li>path_info: 返回用戶訪問url, 不包括域名</li> <li>method: 請求中使用的HTTP方法的字符串表示,全大寫表示。</li> <li>GET: 包含全部HTTP GET參數的類字典對象</li> <li>POST: 包含全部HTTP POST參數的類字典對象</li> <li>body: 請求體,byte類型,request POST的數據就是從body裏面提取到的</li>python

<h2>2. 屬性</h2> django將請求報文中的請求行、頭部信息、內容主體封裝成HttpRequest類中的屬性。除了特殊說明的以外,其餘均爲只讀的。 <h5>(1) HttpRequest.scheme</h5> 表示請求方案的字符串(一般爲http或https) <h5>(2) HttpRequest.body</h5> 一個字符串,表明請求報文的主題。在處理非HTTP形式的報文時很是有用。例如,二進制圖片,XML, Json等。<br> 可是,若是要處理表單數據的時候,推薦仍是使用HttpRequest.POST。<br> 另外,咱們還能夠用python的類文件方法去操做它,詳情參考HttpRequest.read()。 <h5>(3) HttpRequest.path</h5> 一個字符串,表示請求的路徑組件(不含域名)。<br> 好比:"/music/bands/the_beatles/" <h5>(4) HttpRequest.method</h5> 一個字符串,表示請求使用的HTTP方法,必須使用大寫。例如:「GET」、「POST」 <h5>(5) HttpResponse.encoding</h5> 一個字符串,表示提交的數據的編碼方式(若是爲None則表示使用DEFAULT_CHARSET的設置,默認爲"UTF-8")。<br> 這個屬性是可寫的,你能夠修改它來修改訪問表單數據使用的編碼。<br> 接下來對屬性的任何訪問(例如從GET或POST中讀取數據),將使用新的encoding值。<br> 若是你知道表單數據的編碼不是DEFAULT_CHARSET,則使用它。 <h5>(6) HttpRequest.GET</h5> 一個相似於字典的對象,包含HTTP GET的全部參數。詳情參考QueryDict對象。 <h5>(7) HttpRequest.POST</h5> 一個相似於字典的對象,若是請求中包含表單數據,則將這些數據封裝成QueryDict對象。<br> POST請求額能夠帶有空的POST字典——若是經過HTTP POST方法發送一個表單,可是表單沒有任何的數據,QueryDict對象依然會被建立。<br> 所以,不該該使用<kbd>if request.POST</kbd>來檢查使用的是不是POST方法,應該使用<kbd>if request.method == "POST"</kbd>。<br> 另外,若是使用POST上傳文件的話,文件信息將包含在FILES屬性中。ajax

<h5>(8) HttpRequest.COOKIES</h5> 一個標準的Python字典,包含全部的cookie。鍵和值都爲字符串。django

<h5>(9) HttpRequest.FILSES</h5> 一個相似於字典的對象,包含全部的上傳文件信息。<br> FILES中的每一個鍵爲<\input type="file" name="">中的name, 值則爲對應的數據。<br> 注意,FILES只有在請求的方法爲POST, 且提交的<kbd><\from></kbd>帶有<kbd>enctype="multipart/form-data"</kbd>的狀況下才會包含數據,不然,FILES將爲一個空的相似於字典的對象。瀏覽器

<h5>(10) HttpRequest.META</h5> 一個標準的字典,包含全部的HTTP首部。具體的頭部信息取決於客戶端和服務器,下面是一些示例:<br>緩存

HTTP頭部信息 信息含義
CONTENT_LENGTH 請求的正文的長度(是一個字符串)
CONTENT_TYPE 請求的正文的MIME類型
HTTP_ACCEPT 響應可接收的Content-Type
HTTP_ACCEPT_ENCODING 響應可接收的編碼
HTTP_ACCEPT_LANGUAGE 響應可接收的語言
HTTP_HOST 客戶端發送的HTTP Host頭部
HTTP_REFERER Referring頁面
HTTP_USER_AGENT 客戶端的user-agent字符串
QUERY_STRING 單個字符串形式的查詢字符串(未解析過的形式)
REMOTE_ADDR 客戶端的IP地址
REMOTE_HOST 客戶端的主機名
REMOTE_USER 服務器認證後的用戶
REMOTE_METHOD 一個字符串,例如「GET」或「POST」
SERVER_NAME 服務器的主機名
SERVER_PORT 服務器的端口(是一個字符串)

從上面能夠看到,出CONTENT_LENGTH和CONTENT_TYPE以外,請求中的任何HTTP首部轉換爲META的鍵時,都會將全部字母大寫並將鏈接符替換爲下劃線,最後加上HTTP_前綴。<br> 因此一個叫作X-Bender的頭部將轉換成META中的HTTP_X_BENDER鍵。安全

<h5>(11) HttpRequest.user</h5> 一個AUTH_USER_MODEL類型的對象,表示當前登陸的用戶。<br> 若是用戶當前沒有登陸,user將設置爲django.contrib.auth.models.AnonymousUser 的一個實例。<br> 你能夠經過is_authenticated()區分它們。<br> 例如: ```Python if request.user.is_authenticated(): # do something for logged-in users. else: # do something for anonymous users. ``` user只有當Django啓用AuthenticationMiddleware中間件時纔可用。<br> 匿名用戶class models.AnonymousUser <br> django.contrib.auth.models.AnonymousUser類實現了django.contrib.auth.models.User接口,但具備下面幾個不一樣點:<br> is 永遠爲 None。<br> username() 永遠 返回空字符串。<br> is_staff 和 is_superuser 永遠爲False。<br> is_active 永遠爲 False。<br> gropus和user_permissions永遠爲空。<br> is_anonymous()返回True而不是False。<br> is_authenticated() 返回False而不是True。<br> set_password()、check_password()、save()和delete()引起NotImplementedError。<br> New in Django 1.8:<br> 新增AnonymousUser.get_username()以更好地模擬django.contrib.auth.modele.User.服務器

<h5>(12) HttpRequest.session</h5> 一個便可讀又可寫的相似於字典的對象,表示當前的會話.只有當django啓用會話的支持時纔可用.cookie

<h2>3. 上傳文件示例</h2> ```Python def upload(request): """ 保存文件上傳前,數據須要保存在某個位置。 默認當上傳文件小於2.5M時,django會將上傳文件的所有內容讀進內存。 從內存讀取一次,寫磁盤一次 當上傳文件很大時,django會把上傳文件寫到臨時文件中,而後存放到系統臨時臨時文件夾中。 :param request: :return: """ if request.method == "POST": # 從請求的FILES中獲取上傳文件的文件名 # file爲頁面上type=files類型input的name屬性值 filename = request.FILES["file"].name # 在項目目錄下新建一個文件 with open(filename, "wb") as f: #從上傳的文件對象中一點一點讀 for chunk in request.FILES["file"].chunks(): f.write(chunk) return HttpResponse("upload successfully!") ```session

<h2>4. 方法</h2> <h3>4.1 HttpRequest.get_host()</h3> 根據從HTTP_X_FORWARDED_HOST(若是打開USE_X_FORWARDE_HOST,默認爲false)和HTTP_HOST頭部信息返回請求的原始主機。<br> 若是這兩個頭部沒有提供相應的值,則使用SERVER_NAME和SERVER_PORT,在PEP3333中有詳細描述。<br> USE_X_FORWARDED_HOST:一個布爾值,用因而否優先使用X-Fforwarded-Host首部,僅在代理設置了該首部的狀況下,才能夠被使用。例如:"127.0.0.1:8000"<br> 注意:當主機位於多個代理後面時,get_host()方法將會失敗。除非使用中間件重寫代理的首部。 <h3>4.2 HttpRequest.get_full_path()</h3> 返回path,若是能夠將加上查詢字符串。<br> 例如:"/music/bands/the_beatles/?print=true"

<h3>4.3 HttpRequest.get_signed_cookid()</h3> 語法格式爲: >HttpRequest.get_signed_cookid(key, default=RAISE_ERROR, salt="", max_age=None)

返回簽名過的Cookie對應的值,若是簽名再也不合法則返回django.core.signing.BadSignature。<br> 若是提供default參數,將不會引起異常並返回default的值。<br> 可選參數salt,能夠用來對安全密鑰強力攻擊提供額外的保護。<br> max_age參數用於檢查Cookie對應的時間戳以確保Cookie的時間不會超過max_age秒。

<h3>4.4 HttpRequest.is_secure()</h3> 若是請求時安全的,則返回True,即請求是經過HTTPS發起的。

<h3>4.5 HttpRequest.is_ajax()</h3> 若是請求是經過XMLHttpRequest發起的,則返回True,方法是檢查HTTP_X_REQUESTED_WITH相應的首部是不是字符串"XMLHttpRequest"。<br> 大部分現代的javaScript庫都會發送這個頭部。若是編寫本身的XMLHttpRequest調用(在瀏覽器端),你必須手工設置這個值來讓is_ajax()能夠工做。<br> 若是一個響應須要根據請求是不是經過AJAX發起的,而且你正在使用某種形式的緩存如django的cache middleware,你應該使用vary_on_headers("HTTP_X_REQUESTED_WITH")裝飾你的視圖以讓響應可以正確地緩存。 <h3>4.6 注意</h3> 鍵值對的值是多個的時候,好比checkbox類型的input標籤,select標籤,須要用: ```Python request.POST.getlist("hobby") ```

相關文章
相關標籤/搜索