首頁 後端開發 Python教學 Django學習筆記之Class-Based-View

Django學習筆記之Class-Based-View

Feb 18, 2017 am 10:17 AM

前言

大家都知道其實學習Django非常簡單,幾乎不用花什麼精力就可以入門了。配置一個url,分給一個函數處理它,回傳response,幾乎都沒有什麼很難理解的地方。

寫多了,有些問題才逐漸體認到。例如有一個view比較複雜,呼叫了很多其他的函數。想要把這些函數封裝起來,怎麼辦?當然,可以用註解#------view------這樣將函數隔離開,這種方法太low了,簡直是在騙自己,連封裝都算不上。

Python是一個物件導向的程式語言,如果只用函數來開發,有很多物件導向的優點就錯失了(繼承、封裝、多型)。所以Django在後來加入了Class-Based-View。可以讓我們用類別寫View。這樣做的優點主要下面兩種:

  1. 提高了程式碼的複用性,可以使用物件導向的技術,例如Mixin(多重繼承)

  2. 可以用不同的函數針對不同的HTTP方法處理,而不是透過很多if判斷,提高程式碼可讀性

使用class-based views

如果我們要寫一個處理GET方法的view,用函數寫的話是下面這樣。

from django.http import HttpResponse
 
def my_view(request):
 if request.method == 'GET':
  # <view logic>
  return HttpResponse(&#39;result&#39;)
登入後複製

如果用class-based view寫的話,就是下面這樣。

from django.http import HttpResponse
from django.views import View
 
class MyView(View):
 def get(self, request):
  # <view logic>
  return HttpResponse(&#39;result&#39;)
登入後複製

Django的url是將一個請求分配給可調用的函數的,而不是一個class。針對這個問題,class-based view提供了一個as_view()靜態方法(也就是類別方法),呼叫這個方法,會建立一個類別的實例,然後透過實例呼叫dispatch()方法,dispatch( )方法會根據request的method的不同呼叫對應的方法來處理request(如get() , post()等)。到這裡,這些方法和function-based view差不多了,要接收request,得到一個response回傳。如果方法沒有定義,會拋出HttpResponseNotAllowed異常。

在url中,就這麼寫:

# urls.py
from django.conf.urls import url
from myapp.views import MyView
 
urlpatterns = [
 url(r&#39;^about/$&#39;, MyView.as_view()),
]
登入後複製

類的屬性可以透過兩種方法設置,第一種是常見的Python的方法,可以被子類覆蓋。

from django.http import HttpResponse
from django.views import View
 
class GreetingView(View):
 greeting = "Good Day"
 
 def get(self, request):
  return HttpResponse(self.greeting)
 
# You can override that in a subclass
 
class MorningGreetingView(GreetingView):
 greeting = "Morning to ya"
登入後複製

第二種方法,你也可以在url中指定類別的屬性:

在url設定類別的屬性Python

urlpatterns = [
 url(r&#39;^about/$&#39;, GreetingView.as_view(greeting="G&#39;day")),
]
登入後複製

覺得要理解django的class-based-view(以下簡稱cbv),首先要明白django引進cbv的目的是什麼。在django1.3之前,generic view也就是所謂的通用視圖,使用的是function-based-view(fbv),也也就是基於函數的視圖。有人認為fbv比cbv更pythonic,竊以為不然。 python的一大重要的特性就是物件導向。而cbv更能體現python的物件導向。 cbv是透過class的方式來實作視圖方法的。 class相對於function,更能利用多態的特定,因此更容易從宏觀層面上將項目內的比較通用的功能抽象化出來。關於多態,不多解釋,有興趣的同學自己Google。總之可以理解為一個東西具有多種形態(的特性)。 cbv的實作原理透過看django的源碼就很容易明白,大體就是由url路由到這個cbv之後,透過cbv內部的dispatch方法進行分發,將get請求分發給cbv.get方法處理,將post請求分發給cbv .post方法處理,其他方法類似。怎麼利用多態呢? cbv裡引進了mixin的概念。 Mixin就是寫好了的一些基礎類,然後透過不同的Mixin組合成為最終想要的類別。 所以,理解cbv的基礎是,理解Mixin。 Django中使用Mixin來重複使用程式碼,一個View Class可以繼承多個Mixin,但只能繼承一個View(包含View的子類別),建議把View寫在最右邊,多個Mixin寫在左邊。 Mixin也是比較複雜的技術,本文不詳細說了,以後再寫一篇針對Mixin的文章吧。

使用裝飾器

在CBV中,可以使用method_decorator來裝飾方法。

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView
 
class ProtectedView(TemplateView):
 template_name = &#39;secret.html&#39;
 
 @method_decorator(login_required)
 def dispatch(self, *args, **kwargs):
  return super(ProtectedView, self).dispatch(*args, **kwargs)
登入後複製

也可以寫在類別上面,傳入方法的名字。

@method_decorator(login_required, name=&#39;dispatch&#39;)
class ProtectedView(TemplateView):
 template_name = &#39;secret.html&#39;
登入後複製

如果有多個裝飾器裝飾一個方法,可以寫成一個list。例如,下面這兩種寫法是等價的。

decorators = [never_cache, login_required]
 
@method_decorator(decorators, name='dispatch')
class ProtectedView(TemplateView):
 template_name = 'secret.html'
 
@method_decorator(never_cache, name='dispatch')
@method_decorator(login_required, name=&#39;dispatch&#39;)
class ProtectedView(TemplateView):
 template_name = &#39;secret.html&#39;
登入後複製

更多Django學習筆記之Class-Based-View相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1273
29
C# 教程
1252
24
Python vs.C:申請和用例 Python vs.C:申請和用例 Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

Python:遊戲,Guis等 Python:遊戲,Guis等 Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python與C:學習曲線和易用性 Python與C:學習曲線和易用性 Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

Python和時間:充分利用您的學習時間 Python和時間:充分利用您的學習時間 Apr 14, 2025 am 12:02 AM

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python vs.C:探索性能和效率 Python vs.C:探索性能和效率 Apr 18, 2025 am 12:20 AM

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

Python標準庫的哪一部分是:列表或數組? Python標準庫的哪一部分是:列表或數組? Apr 27, 2025 am 12:03 AM

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

Python:自動化,腳本和任務管理 Python:自動化,腳本和任務管理 Apr 16, 2025 am 12:14 AM

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

學習Python:2小時的每日學習是否足夠? 學習Python:2小時的每日學習是否足夠? Apr 18, 2025 am 12:22 AM

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。

See all articles