當一個頁面被請求時,django就會創建一個包含本次請求原信息的HttpRequest對象。
django會將這個對象自動傳遞給響應的視圖函數,一般視圖函數約定俗成地使用request參數承接這個對象。
1. 請求相關的常用值
2. 屬性
django將請求報文中的請求行、頭部信息、內容主體封裝成HttpRequest類中的屬性。除了特殊說明的之外,其他均為只讀的。(1) HttpRequest.scheme
表示請求方案的字符串(通常為http或https)(2) HttpRequest.body
一個字符串,代表請求報文的主題。在處理非HTTP形式的報文時非常有用。例如,二進制圖片,XML, Json等。但是,如果要處理表單數據的時候,推薦還是使用HttpRequest.POST。
另外,我們還可以用python的類文件方法去操作它,詳情參考HttpRequest.read()。
(3) HttpRequest.path
一個字符串,表示請求的路徑組件(不含域名)。比如:"/music/bands/the_beatles/"
(4) HttpRequest.method
一個字符串,表示請求使用的HTTP方法,必須使用大寫。例如:“GET”、“POST”(5) HttpResponse.encoding
一個字符串,表示提交的數據的編碼方式(如果為None則表示使用DEFAULT_CHARSET的設置,默認為"UTF-8")。這個屬性是可寫的,你可以修改它來修改訪問表單數據使用的編碼。
接下來對屬性的任何訪問(例如從GET或POST中讀取數據),將使用新的encoding值。
如果你知道表單數據的編碼不是DEFAULT_CHARSET,則使用它。
(6) HttpRequest.GET
一個類似於字典的對象,包含HTTP GET的所有參數。詳情參考QueryDict對象。(7) HttpRequest.POST
一個類似於字典的對象,如果請求中包含表單數據,則將這些數據封裝成QueryDict對象。POST請求額可以帶有空的POST字典——如果通過HTTP POST方法發送一個表單,但是表單沒有任何的數據,QueryDict對象依然會被創建。
因此,不應該使用 if request.POST來檢查使用的是否是POST方法,應該使用 if request.method == "POST"。
另外,如果使用POST上傳文件的話,文件信息將包含在FILES屬性中。
(8) HttpRequest.COOKIES
一個標准的Python字典,包含所有的cookie。鍵和值都為字符串。(9) HttpRequest.FILSES
一個類似於字典的對象,包含所有的上傳文件信息。FILES中的每個鍵為<\input type="file" name="">中的name, 值則為對應的數據。
注意,FILES只有在請求的方法為POST, 且提交的 <\from>帶有 enctype="multipart/form-data"的情況下才會包含數據,否則,FILES將為一個空的類似於字典的對象。
(10) HttpRequest.META
一個標准的字典,包含所有的HTTP首部。具體的頭部信息取決於客戶端和服務器,下面是一些示例: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_前綴。
所以一個叫做X-Bender的頭部將轉換成META中的HTTP_X_BENDER鍵。
(11) HttpRequest.user
一個AUTH_USER_MODEL類型的對象,表示當前登錄的用戶。如果用戶當前沒有登錄,user將設置為django.contrib.auth.models.AnonymousUser 的一個實例。
你可以通過is_authenticated()區分它們。
例如: ```Python if request.user.is_authenticated(): # do something for logged-in users. else: # do something for anonymous users. ``` user只有當Django啟用AuthenticationMiddleware中間件時才可用。
匿名用戶class models.AnonymousUser
django.contrib.auth.models.AnonymousUser類實現了django.contrib.auth.models.User接口,但具有下面幾個不同點:
is 永遠為 None。
username() 永遠 返回空字符串。
is_staff 和 is_superuser 永遠為False。
is_active 永遠為 False。
gropus和user_permissions永遠為空。
is_anonymous()返回True而不是False。
is_authenticated() 返回False而不是True。
set_password()、check_password()、save()和delete()引發NotImplementedError。
New in Django 1.8:
新增AnonymousUser.get_username()以更好地模擬django.contrib.auth.modele.User.
(12) HttpRequest.session
一個即可讀又可寫的類似於字典的對象,表示當前的會話.只有當django啟用會話的支持時才可用.3. 上傳文件示例
```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!") ```4. 方法
4.1 HttpRequest.get_host()
根據從HTTP_X_FORWARDED_HOST(如果打開USE_X_FORWARDE_HOST,默認為false)和HTTP_HOST頭部信息返回請求的原始主機。如果這兩個頭部沒有提供相應的值,則使用SERVER_NAME和SERVER_PORT,在PEP3333中有詳細描述。
USE_X_FORWARDED_HOST:一個布爾值,用於是否優先使用X-Fforwarded-Host首部,僅在代理設置了該首部的情況下,才可以被使用。例如:"127.0.0.1:8000"
注意:當主機位於多個代理后面時,get_host()方法將會失敗。除非使用中間件重寫代理的首部。
4.2 HttpRequest.get_full_path()
返回path,如果可以將加上查詢字符串。例如:"/music/bands/the_beatles/?print=true"
4.3 HttpRequest.get_signed_cookid()
語法格式為: >HttpRequest.get_signed_cookid(key, default=RAISE_ERROR, salt="", max_age=None)返回簽名過的Cookie對應的值,如果簽名不再合法則返回django.core.signing.BadSignature。
如果提供default參數,將不會引發異常並返回default的值。
可選參數salt,可以用來對安全密鑰強力攻擊提供額外的保護。
max_age參數用於檢查Cookie對應的時間戳以確保Cookie的時間不會超過max_age秒。
4.4 HttpRequest.is_secure()
如果請求時安全的,則返回True,即請求是通過HTTPS發起的。4.5 HttpRequest.is_ajax()
如果請求是通過XMLHttpRequest發起的,則返回True,方法是檢查HTTP_X_REQUESTED_WITH相應的首部是否是字符串"XMLHttpRequest"。大部分現代的javaScript庫都會發送這個頭部。如果編寫自己的XMLHttpRequest調用(在瀏覽器端),你必須手工設置這個值來讓is_ajax()可以工作。
如果一個響應需要根據請求是否是通過AJAX發起的,並且你正在使用某種形式的緩存如django的cache middleware,你應該使用vary_on_headers("HTTP_X_REQUESTED_WITH")裝飾你的視圖以讓響應能夠正確地緩存。