HttpRequest 對象

當請求一個頁面時,Django 會建立一個包含請求元數據的 HttpRequest 對象。 當 Django 加載對應的視圖時,HttpRequest 對象將作為視圖函數的第一個參數(即:request)。每個視圖會返回一個 HttpResponse 對象。




屬性

  • HttpRequest.scheme

一個字符串,表示請求的方案(通常是 http 或 https)。

  • HttpRequest.body

一個字節字符串,表示原始 HTTP 請求的正文。

  • HttpRequest.path

一個字符串,表示請求的頁面的完整路徑,不包含域名。
例如:"/music/bands/the_beatles/"

  • HttpRequest.path_info

在某些 Web 服務器配置下,主機名后的 URL 部分被分成腳本前綴部分和路徑信息部分。path_info 屬性將始終包含路徑信息部分,不論使用的 Web 服務器是什么。使用它代替 path 可以讓代碼在測試和開發環境中更容易地切換。

  • HttpRequest.method

一個字符串,表示請求使用的 HTTP 方法。必須使用大寫。例如:

if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()
  • HttpRequest.encoding

一個字符串,表示提交的數據的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 設置)。你可以通過修改它來修改訪問表單數據使用的編碼。

  • HttpRequest.GET

一個類似于字典的對象,包含 HTTP GET 的所有參數

  • HttpRequest.POST

一個類似于字典的對象,包含所有給定的 HTTP POST參數,提供了包含表單數據的請求。

  • HttpRequest.COOKIES

一個標準的 Python 字典,包含所有的 cookie。鍵和值都為字符串。

  • HttpRequest.FILES

一個類似于字典的對象,包含所有的上傳文件。FILES 中的每個鍵為 <input type="file" name="" /> 中的 name。

  • HttpRequest.META

一個標準的 Python 字典,包含所有的 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 —— 服務器認證后的用戶。
  • REQUEST_METHOD —— 一個字符串,例如"GET" 或"POST"。
  • SERVER_NAME —— 服務器的主機名。
  • SERVER_PORT —— 服務器的端口(是一個字符串)。

從上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,請求中的任何 HTTP 頭部轉換為 META 的鍵時,都會將所有字母大寫并將連接符替換為下劃線最后加上 HTTP_ 前綴。所以,一個叫做 X-Bender 的頭部將轉換成META 中的 HTTP_X_BENDER 鍵。

  • HttpRequest.user

一個 AUTH_USER_MODEL 類型的對象,表示當前登錄的用戶。如果用戶當前沒有登錄,user 將設置為 django.contrib.auth.models.AnonymousUser 的一個實例。你可以通過 is_authenticated() 區分它們,像這樣:

if request.user.is_authenticated():
    # Do something for logged-in users.
else:
    # Do something for anonymous users.




方法

  • HttpRequest.get_host()

根據從 HTTP_X_FORWARDED_HOST(如果打開 USE_X_FORWARDED_HOST)和 HTTP_HOST 頭部信息返回請求的原始主機。如果這兩個頭部沒有提供相應的值,則使用 SERVER_NAME 和 SERVER_PORT,在 PEP 3333 中有詳細描述。

例如:"127.0.0.1:8000"

  • HttpRequest.get_full_path()

返回 path,如果可以將加上查詢字符串。

例如:"/music/bands/the_beatles/?print=true"

  • HttpRequest.build_absolute_uri(location)

返回 location 的絕對 URI。如果 location 沒有提供,則設置為 request.get_full_path()。

如果 URI 已經是一個絕對的URI,將不會修改。否則,使用請求中的服務器相關的變量構建絕對URI。

例如:"http://example.com/music/bands/the_beatles/?print=true"

  • HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

返回簽名過的 Cookie 對應的值,如果簽名不再合法則返回 django.core.signing.BadSignature。如果提供 default 參數,將不會引發異常并返回 default 的值。

可選參數 salt 可以用來對安全密鑰強力攻擊提供額外的保護。max_age 參數用于檢查 Cookie 對應的時間戳以確保 Cookie 的時間不會超過 max_age 秒。

  • HttpRequest.is_secure()

如果請求時是安全的,則返回 True;即請求是通過 HTTPS 發起的。

  • 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') 裝飾你的視圖以讓響應能夠正確地緩存。

  • HttpRequest.read(size=None)
  • HttpRequest.readline()
  • HttpRequest.readlines()
  • HttpRequest.xreadlines()
  • HttpRequest.__iter__()

這幾個方法實現類文件的接口用于讀取 HttpRequest 實例。這使得可以用流的方式讀取進來的請求。一個常見的用例是使用迭代解析器處理大型 XML 有效載荷,而不在內存中構造一個完整的 XML 樹。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,228評論 2 375

推薦閱讀更多精彩內容