Django的視圖函數

        一個視圖函數(類),簡稱視圖,是一個簡單的Python 函數(類),它接受Web請求而且返回Web響應。html

   響應能夠是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖片。django

   不管視圖自己包含什麼邏輯,都要返回響應。代碼寫在哪裏也無所謂,只要它在你當前項目目錄下面。除此以外沒有更多的要求了——能夠說「沒有什麼神奇的地方」。爲了將代碼放在某處,你們約定成俗將視圖放置在項目(project)或應用程序(app)目錄中的名爲views.py的文件中。編程

 

例如:瀏覽器

from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

 讓咱們來逐行解釋下上面的代碼:app

  • 首先,咱們從 django.http模塊導入了HttpResponse類,以及Python的datetime庫。編程語言

  • 接着,咱們定義了current_datetime函數。它就是視圖函數。每一個視圖函數都使用HttpRequest對象做爲第一個參數,而且一般稱之爲request函數

    注意,視圖函數的名稱並不重要;不須要用一個統一的命名方式來命名,以便讓Django識別它。咱們將其命名爲current_datetime,是由於這個名稱可以比較準確地反映出它實現的功能。spa

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

  Django使用請求和響應對象來經過系統傳遞狀態。csrf

  當瀏覽器向服務端請求一個頁面時,Django建立一個HttpRequest對象,該對象包含關於請求的元數據。而後,Django加載相應的視圖,將這個HttpRequest對象做爲第一個參數傳遞給視圖函數。

  每一個視圖負責返回一個HttpResponse對象。

關於FBV和CBV:

        FBV(function base views) 就是在視圖裏使用函數處理請求。

    以前都是FBV模式寫的代碼,因此就不寫例子了。

  CBV(class base views) 就是在視圖裏使用類處理請求。

  Python是一個面向對象的編程語言,若是隻用函數來開發,有不少面向對象的優勢就錯失了(繼承、封裝、多態)。因此Django在後來加入了Class-Based-View。可讓咱們用類寫View。這樣作的優勢主要下面兩種:

  1. 提升了代碼的複用性,可使用面嚮對象的技術,好比Mixin(多繼承)
  2. 能夠用不一樣的函數針對不一樣的HTTP方法處理,而不是經過不少if判斷,提升代碼可讀性

關於給視圖加裝飾器:

  • 添加裝飾器前必須導入from django.utils.decorators import method_decorator
  • 添加裝飾器的格式必須爲@method_decorator(),括號裏面爲裝飾器的函數名
  • 給類添加是必須聲明name
  • 注意csrf-token裝飾器的特殊性,在CBV模式下它只能加在dispatch上面

  下面這是csrf_token的裝飾器:

  @csrf_protect,爲當前函數強制設置防跨站請求僞造功能,即使settings中沒有設置csrfToken全局中間件。

  @csrf_exempt,取消當前函數防跨站請求僞造功能,即使settings中設置了全局中間件。

  注意:from django.views.decorators.csrf import csrf_exempt,csrf_protect

相關文章
相關標籤/搜索