1. 程式人生 > >Django檢視層之請求物件(request)和響應物件(HttpResponse)

Django檢視層之請求物件(request)和響應物件(HttpResponse)

1.請求物件(request)

request屬性
django將請求報文中的請求行,首部資訊,內容主體封裝成HttpRequest類中的屬性。除了特殊說明的之外,其他的均為只讀。
1.HttpRequest.GET
  一個類似於字典的物件,包含 HTTP GET 的所有引數。詳情請參考 QueryDict 物件。

2.HttpRequest.POST
  一個類似於字典的物件,如果請求中包含表單資料,則將這些資料封裝成 QueryDict 物件。
  POST 請求可以帶有空的 POST 字典 —— 如果通過 HTTP POST 方法傳送一個表單,但是表單中沒有任何的資料,QueryDict 物件依然會被建立。
   因此,不應該使用 
if request.POST 來檢查使用的是否是POST 方法;應該使用 if request.method == "POST"   另外:如果使用 POST 上傳檔案的話,檔案資訊將包含在 FILES 屬性中。 注意:鍵值對的值是多個的時候,比如checkbox型別的input標籤,select標籤,需要用: request.POST.getlist("hobby") 3.HttpRequest.body   一個字串,代表請求報文的主體。在處理非 HTTP 形式的報文時非常有用,例如:二進位制圖片、XML,Json等。   但是,如果要處理表單資料的時候,推薦還是使用 HttpRequest.POST 。
4.HttpRequest.path   一個字串,表示請求的路徑元件(不含域名)。   例如:"/music/bands/the_beatles/" 5.HttpRequest.method   一個字串,表示請求使用的HTTP 方法。必須使用大寫。   例如:"GET""POST" 6.HttpRequest.encoding   一個字串,表示提交的資料的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 的設定,預設為 'utf-8')。 這個屬性是可寫的,你可以修改它來修改訪問表單資料使用的編碼。 接下來對屬性的任何訪問(例如從 GET 或 POST 中讀取資料)將使用新的 encoding 值。 如果你知道表單資料的編碼不是 DEFAULT_CHARSET ,則使用它。
7.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 鍵。 8.HttpRequest.FILES   一個類似於字典的物件,包含所有的上傳檔案資訊。 FILES 中的每個鍵為<input type="file" name="" /> 中的name,值則為對應的資料。   注意,FILES 只有在請求的方法為POST 且提交的<form> 帶有enctype="multipart/form-data" 的情況下才會 包含資料。否則,FILES 將為一個空的類似於字典的物件。 9.HttpRequest.COOKIES   一個標準的Python 字典,包含所有的cookie。鍵和值都為字串。 10.HttpRequest.session   一個既可讀又可寫的類似於字典的物件,表示當前的會話。只有當Django 啟用會話的支援時才可用。 完整的細節參見會話的文件。 11.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.   user 只有當Django 啟用 AuthenticationMiddleware 中介軟體時才可用。 ------------------------------------------------------------------------------------- 匿名使用者 class models.AnonymousUser django.contrib.auth.models.AnonymousUser 類實現了django.contrib.auth.models.User 介面,但具有下面幾個不同點: id 永遠為None。 username 永遠為空字串。 get_username() 永遠返回空字串。 is_staff 和 is_superuser 永遠為False。 is_active 永遠為 False。 groups 和 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.models.User。
request常用方法
1.HttpRequest.get_full_path()
  返回 path,如果可以將加上查詢字串。
  例如:"/music/bands/the_beatles/?print=true"
2.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') 裝飾你的檢視以讓響應能夠正確地快取。

2.響應物件

響應物件主要有三種形式:

1.HttpResponse():

HttpResponse括號內直接跟一個具體的字串作為響應體,比較直接很簡單,所以這裡主要介紹後面兩種形式。

2.render():

render(request, template_name[,  context])

給定一個給定的模版和一給定的上下文字典,並返回一個渲染後的HttpResponse物件。

例如:

render(request,‘index.html’,{"ctime_key":ctime})

相對應的html檔案:

<h1>{{ ctime_key }}</h1>   # 任意標籤

3.redirect()

傳遞要重定向的一個硬編碼的URL

def my_view(request):
    ...
    return redirect('/some/url/')

也可以是一個完整的URL

def my_view(request):
    ...
    return redirect('http://example.com/')