1. 程式人生 > >詳解Django中Request物件的相關用法

詳解Django中Request物件的相關用法

從Request物件中獲取資料

我們在第三章講述View的函式時已經介紹過HttpRequest物件了,但當時並沒有講太多。 讓我們回憶下:每個view函式的第一個引數是一個HttpRequest物件,就像下面這個hello()函式:

?
1 2 3 4 from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")

HttpRequest物件,比如上面程式碼裡的request變數,會有一些有趣的、你必須讓自己熟悉的屬性和方法,以便知道能拿它們來做些什麼。 在view函式的執行過程中,你可以用這些屬性來獲取當前request的一些資訊(比如,你正在載入這個頁面的使用者是誰,或者用的是什麼瀏覽器)。
URL相關資訊

HttpRequest物件包含當前請求URL的一些資訊:

2015717145228518.jpg (703×207)

在view函式裡,要始終用這個屬性或方法來得到URL,而不要手動輸入。 這會使得程式碼更加靈活,以便在其它地方重用。 下面是一個簡單的例子:

?
1 2 3 4 5 6 7 # BAD! def current_url_view_bad(request): return HttpResponse("Welcome to the page at /current/") # GOOD def current_url_view_good(request): return HttpResponse(
"Welcome to the page at %s" % request.path)

有關request的其它資訊

request.META 是一個Python字典,包含了所有本次HTTP請求的Header資訊,比如使用者IP地址和使用者Agent(通常是瀏覽器的名稱和版本號)。 注意,Header資訊的完整列表取決於使用者所傳送的Header資訊和伺服器端設定的Header資訊。 這個字典中幾個常見的鍵值有:

  •     HTTP_REFERER,進站前連結網頁,如果有的話。 (請注意,它是REFERRER的筆誤。)
  •     HTTP_USER_AGENT,使用者瀏覽器的user-agent字串,如果有的話。 例如: "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .
  •     REMOTE_ADDR 客戶端IP,如:"12.345.67.89" 。(如果申請是經過代理伺服器的話,那麼它可能是以逗號分割的多個IP地址,如:"12.345.67.89,23.456.78.90" 。)

注意,因為 request.META 是一個普通的Python字典,因此當你試圖訪問一個不存在的鍵時,會觸發一個KeyError異常。 (HTTP header資訊是由使用者的瀏覽器所提交的、不應該給予信任的“額外”資料,因此你總是應該好好設計你的應用以便當一個特定的Header資料不存在時,給出一個優雅的迴應。)你應該用 try/except 語句,或者用Python字典的 get() 方法來處理這些“可能不存在的鍵”:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # BAD! def ua_display_bad(request): ua = request.META['HTTP_USER_AGENT'] # Might raise KeyError! return HttpResponse("Your browser is %s" % ua) # GOOD (VERSION 1) def ua_display_good1(request): try: ua = request.META['HTTP_USER_AGENT'] except KeyError: ua = 'unknown' return HttpResponse("Your browser is %s" % ua) # GOOD (VERSION 2) def ua_display_good2(request): ua = request.META.get('HTTP_USER_AGENT', 'unknown') return HttpResponse("Your browser is %s" % ua)

我們鼓勵你動手寫一個簡單的view函式來顯示 request.META 的所有資料,這樣你就知道里面有什麼了。 這個view函式可能是這樣的:

?
1

相關推薦

DjangoRequest物件相關用法

從Request物件中獲取資料 我們在第三章講述View的函式時已經介紹過HttpRequest物件了,但當時並沒有講太多。 讓我們回憶下:每個view函式的第一個引數是一個HttpRequest物件,就像下面這個hello()函式: ? 1 2 3 4 from djang

C++ this指標的 C++this指標的用法

C++中this指標的用法詳解   轉自:http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指標的用處:   一個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果

從原始碼解析Python的Flask框架request物件用法

from flask import requestFlask 是一個人氣非常高的Python Web框架,筆者也拿它寫過一些大大小小的專案,Flask 有一個特性我非常的喜歡,就是無論在什麼地方,如果你想要獲取當前的request物件,只要 簡單的: 從當前request

CSS:nth-child的用法

下面我將用幾個典型的例項來給大家講解:nth-child的實際用途: Tips:還用低版本的IE瀏覽器的哥們請繞過! :nth-child(2)選取第幾個標籤,“2可以是你想要的數字” .demo01 li:nth-child(2){background:#090}  :nth-c

Djangorequest物件與response物件

瀏覽器向伺服器傳引數,主要通過以下四種方式 檢視函式定義方式 from django.shortcuts import render from django.http import HttpResponse, JsonResponse import json # 1獲取URL中的引數 de

CSS3:nth-child的用法

CSS3中:nth-child的實際用途:不適用低版本的IE瀏覽器! (1):nth-child(n + 4)選取大於等於4的標籤,其中"n"為整數,下同 .demo01 li:nth-child(n+4){background:#090} (2):nth-chi

django的collectstatic命令以及STATIC_URL、STATIC_ROOT配置

前言 我最近在琢磨django框架的使用,在上傳個人網站伺服器上時,再次遇到了找不到靜態檔案,css、img等樣式全無的問題。於是沉下心來,好好研究了django的靜態檔案到底應該怎麼去部署(deploy),一點心得體會現分享於下。 1. python mana

Python的join()函數的用法

pre 說明 bsp 字符 指定 .net 絕對路徑 字典 -s 函數:string.join() Python中有join()和os.path.join()兩個函數,具體作用如下: join(): 連接字符串數組。將字符串、元組、列表中的元素以指定的字符(分

js數組foEach和map的用法 jq的$.each和$.map

cnblogs arr 對象 cal for index source asc 原生js 數組中foEach和map的用法詳解 相同點: 1.都是循環遍歷數組(僅僅是數組)中的每一項。 2.forEach() 和 map() 裏面每一次執行匿名函數都支持3個參數:數組中的

MySQLconcat函數的用法(連接字符串)

連接 container 使用方法 字符串 border IT 冗余 str () MySQL中concat函數 使用方法: CONCAT(str1,str2,…) 返回結果為連接參數產生的字符串。如有任何一個參數為NULL ,則返回值為 NULL。

Java的時區類TimeZone的用法

void system類 深入 pri comment 相對 系統 就會 lean 一、TimeZone 簡介 TimeZone 表示時區偏移量,也可以計算夏令時。 在操作 Date, Calendar等表示日期/時間的對象時,經常會用到TimeZone;因為不同的時區,

Python的join()函式的用法

  函式:string.join() Python中有join()和os.path.join()兩個函式,具體作用如下:     join():    連線字串陣列。將字串、元組、列表中的元素以指定的字元(分隔符)連線生成

PHPforeach的用法和例項

在PHP中經常會用到foreach的使用,而要用到foreach,就必須用到陣列。因此,在這篇文章中,我們一邊講陣列,一邊講foreach。 foreach有兩種語法: 第一種:遍歷給定的 陣列語句 array_expression 陣列。每次迴圈中,當前單元的值被賦給

CentOS定時執行釋放記憶體的Shell指令碼及相關原理

本文由荒原之夢原創,原文連結:http://zhaokaifeng.com/?p=748 本文總體結構: 第一部分:本文中釋放系統記憶體的原理 第二部分:建立用於釋放記憶體的Shell指令碼並加入到系統定時任務 第三部分:詳細分析Shell指令碼中的每一條指令 第四部

JavaMap用法

Map以按鍵/數值對的形式儲存資料,這裡要特別說明( Map.Entry,是Map的內部類,它用來描述Map中的鍵/值對)。 Map是一個介面,我們平時多用它的實現類HashMap。 用例如下: 1 public static void main(String args

Python的join()函式的用法(字串和os.path)

函式:string.join() Python中有join()和os.path.join()兩個函式,具體作用如下: join(): 連線字串陣列。將字串、元組、列表中的元素以指定的字元(分隔符)連線生成一個新的字串 os.path.

postman(六):在Pre-request Script如何執行請求

上一篇藉著如何在不同介面之間傳遞資料簡單說了下如何在postman編寫指令碼來發送請求,這裡再詳細介紹一下如何在Pre-request Script和Tests標籤中編寫指令碼來。因為我目前研究的也不是很深,對js也只是瞭解一點皮毛,所以大部分還是依賴postman已經封裝好的方法來介紹 這裡以P

sql去重複操作SQLdistinct的用法

在使用mysql時,有時需要查詢出某個欄位不重複的記錄,這時可以使用mysql提供的distinct這個關鍵字來過濾重複的記錄,但是實際中我們往往用distinct來返回不重複欄位的條數(count(distinct id)),其原因是distinct只能返回他的目標欄位,而無法返回其他欄位,例如有如下表

java 亂碼_jsppageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")

  可以簡單認為是,pageEncoding是jsp檔案本身的編碼;contentType的charset是指伺服器傳送給客戶端時的內容編碼。 例如:pageEncoding="GBK"。這句話的意思是,告訴JVM 這個jsp本身採用的"GBK"編碼,在JSP編譯成Servlet傳

Servlet(二):request和response物件

什麼是request和response request物件是伺服器對瀏覽器請求的封裝,而response是伺服器對伺服器響應的封裝。 request用來取出請求資訊,而response則用來新增要返回給瀏覽器的資訊。 使用response物件設定h