6 Django的視圖層

來源:互聯網
上載者:User

標籤:識別   應對   包含   內容   多個   serve   space   body   lse   

視圖函數

一個視圖函數,簡稱視圖,是一個簡單的Python 函數,它接受Web請求並且返回Web響應。響應可以是一張網頁的HTML內容,一個重新導向,一個404錯誤,一個XML文檔,或者一張圖片. . . 是任何東西都可以。無論視圖本身包含什麼邏輯,都要返迴響應。代碼寫在哪裡也無所謂,只要它在你的Python目錄下面。除此之外沒有更多的要求了——可以說“沒有什麼神奇的地方”。為了將代碼放在某處,約定是將視圖放置在項目或應用程式目錄中的名為views.py的檔案中。

下面是一個返回當前日期和時間作為HTML文檔的視圖:

from django.shortcuts import render, HttpResponse, HttpResponseRedirect, redirectimport datetimedef current_datetime(request):    now = datetime.datetime.now()    html = "<html><body>It is now %s.</body></html>" % now    return HttpResponse(html)

讓我們逐行閱讀上面的代碼:

  • 首先,我們從 django.shortcuts模組匯入了HttpResponse類,以及Python的datetime庫。

  • 接著,我們定義了current_datetime函數。它就是視圖函數。每個視圖函數都使用HttpRequest對象作為第一個參數,並且通常稱之為request。

    注意,視圖函數的名稱並不重要;不需要用一個統一的命名方式來命名,以便讓Django識別它。我們將其命名為current_datetime,是因為這個名稱能夠精確地反映出它的功能。

  • 這個視圖會返回一個HttpResponse對象,其中包含產生的響應。每個視圖函數都負責返回一個HttpResponse對象。

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

HttpRequest對象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() 永遠返回Null 字元串。    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‘) 裝飾你的視圖以讓響應能夠正確地緩衝。*/
HttpResponse對象

響應對象主要有三種形式:

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

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

render()
123 render(request, template_name[, context]) 結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的 HttpResponse 對象。
參數:     request: 用於產生響應的請求對象。     template_name:要使用的模板的完整名稱,可選的參數     context:添加到模板內容相關的一個字典。預設是一個空字典。如果字典中的某個值是可調用的,視圖將在渲染模板之前調用它。

render方法就是將一個模板頁面中的模板文法進行渲染,最終渲染成一個html頁面作為響應體。
redirect()

傳遞要重新導向的一個硬式編碼URL

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

也可以是一個完整的URL:

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

key:兩次請求 

 關於301與302

用redirect可以解釋APPEND_SLASH的用法!

6 Django的視圖層

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.