Django-視圖層

Django-視圖層

視圖函數

    一個視圖函數,簡稱視圖,是一個簡單的Python函數,它接受Web請求而且返回Web響應。響應能夠是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖片...任何東西均可以。不管視圖自己包含什麼邏輯,都要返回響應。php

    代碼寫在哪裏也無所謂,只要它在你的Python目錄下面。約定將視圖放置在項目或應用程序目錄中的名爲views.py的文件中html

from django.shortcuts import render, HttpResponse, redirect
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)
  • 每一個視圖函數都使用HttpRequest對象做爲第一個參數,而且一般稱之爲request
  • 每一個視圖函數都負責返回一個HttpResponse對象
  • 視圖函數的名稱並不重要,不須要用一個統一的命名方式來命名,以便讓Django識別它。咱們將其命名爲current_datetime,是由於這個名稱可以精確地反映出它的功能

    視圖層,熟練掌握兩個對象便可:請求對象(HttpRequest)和響應對象(HttpResponse)ajax

HttpRequest對象

request屬性

1. request.method

    一個字符串,表示HTTP請求方式:GET/POST

2. request.path

    一個字符串,表示請求路徑(不含域名),例如:"/music/bands/the_beatles/"

3. request.GET

    一個相似於字典的對象,包含HTTP GET的全部參數,詳情參考QueryDict對象

4. request.POST

    一個相似於字典的對象,若是請求中包含表單數據,剛將這些數據封裝成QueryDict對象
POST請求能夠帶有空的POST字典:若是經過HTTP POST方法發送一個表單,可是表單沒有任何數據,QueryDict對象依然會被建立。所以,不該該使用if request.POST 來檢查使用的是不是POST方法;應該使用
if request.method == 'POST'
另外:若是使用POST上傳文件的話,文件信息將包含在FILES屬性中

獲取request.GET/request.POST內容:
1) 若是 print(request.POST) # <QueryDict: {"user": ["ethan"], "pwd": ["123"]}>
user = request.POST.get("user") # ethan
pwd = request.POST.get("pwd") # 123

2)若是 print(requst.POST) # <QueryDict: {"user": ["ethan", "linda"], "pwd": ["123"]}>
user = request.POST.get("user") # linda 取最後一個

3)鍵值對的值是多個時,須要用 request.POST.getlist()

5. request.body 一個字符串,表明請求報文的主體(請求體原生數據,例如:b"user=Ethan&pwd=123")。在處理非HTTP形式的報文時很是有用,例如:二進制圖片、XML、Json等。 可是,若是要處理表單數據時,推薦仍是使用request.POST 6. request.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 鍵。

request經常使用方法

1. request.get_full_path()

    返回完整path,例如:"/music/bands/the_beatles/?print=true"

2. request.is_ajax()

    返回True/False
    若是請求是經過XMLHttpRequest 發起的,則返回True,方法是檢查 HTTP_X_REQUESTED_WITH 相應的首部是不是字符串'XMLHttpRequest'。

  大部分現代的 JavaScript 庫都會發送這個頭部。若是你編寫本身的 XMLHttpRequest 調用(在瀏覽器端),你必須手工設置這個值來讓 is_ajax() 能夠工做。

  若是一個響應須要根據請求是不是經過AJAX 發起的,而且你正在使用某種形式的緩存例如Django 的 cache middleware,
   你應該使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 裝飾你的視圖以讓響應可以正確地緩存。

HttpResponse對象

    響應對象主要的三種形式:數據庫

  • HttpResponse()
  • render()
  • redirect()

    HttpResponse()括號內直接跟一個具體的字符串做爲響應體。django

render()

    結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的HttpResponse對象瀏覽器

render(request, template_name[, context)

    參數:緩存

  • request:用於生成響應的請求對象
  • template_name:要使用的模板的完整名稱,可選的參數
  • context:添加到模板上下文的一個字典。默認是一個空字典。若是字典中的某個值是可調用的,視圖將在渲染模板以前調用它

    render方法就是將一個模板頁面中的模板語法進行渲染,最終渲染成一個html頁面做爲響應服務器

redirect()

    特色: 兩次請求ide

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

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

    也能夠是一個完整的URL

def my_view(request):
    ...
    return redirect("http://example.com/")
1)301和302的區別。

  301和302狀態碼都表示重定向,就是說瀏覽器在拿到服務器返回的這個狀態碼後會自動跳轉到一個新的URL地址,這個地址能夠從響應的Location首部中獲取
  (用戶看到的效果就是他輸入的地址A瞬間變成了另外一個地址B)——這是它們的共同點。

  他們的不一樣在於。301表示舊地址A的資源已經被永久地移除了(這個資源不可訪問了),搜索引擎在抓取新內容的同時也將舊的網址交換爲重定向以後的網址;

  302表示舊地址A的資源還在(仍然能夠訪問),這個重定向只是臨時地從舊地址A跳轉到地址B,搜索引擎會抓取新的內容而保存舊的網址。 SEO302好於301


2)重定向緣由:
(1)網站調整(如改變網頁目錄結構);
(2)網頁被移到一個新地址;
(3)網頁擴展名改變(如應用須要把.php改爲.Html或.shtml)。
        這種狀況下,若是不作重定向,則用戶收藏夾或搜索引擎數據庫中舊地址只能讓訪問客戶獲得一個404頁面錯誤信息,訪問流量白白喪失;再者某些註冊了多個域名的網站,也須要經過重定向讓訪問這些域名的用戶自動跳轉到主站點等。
重定向
相關文章
相關標籤/搜索