詳解Django中類(lèi)視圖使用裝飾器的方式
類(lèi)視圖使用裝飾器
為類(lèi)視圖添加裝飾器,可以使用兩種方法。
為了理解方便,我們先來(lái)定義一個(gè)為函數(shù)視圖準(zhǔn)備的裝飾器(在設(shè)計(jì)裝飾器時(shí)基本都以函數(shù)視圖作為考慮的被裝飾對(duì)象),及一個(gè)要被裝飾的類(lèi)視圖。
def my_decorator(func): def wrapper(request, *args, **kwargs): print('自定義裝飾器被調(diào)用了') print('請(qǐng)求路徑%s' % request.path) return func(request, *args, **kwargs) return wrapper class DemoView(View): def get(self, request): print('get方法') return HttpResponse('ok') def post(self, request): print('post方法') return HttpResponse('ok')
4.1 在URL配置中裝飾
urlpatterns = [ url(r'^demo/$', my_decorate(DemoView.as_view())) ]
此種方式最簡(jiǎn)單,但因裝飾行為被放置到了url配置中,單看視圖的時(shí)候無(wú)法知道此視圖還被添加了裝飾器,不利于代碼的完整性,不建議使用。
此種方式會(huì)為類(lèi)視圖中的所有請(qǐng)求方法都加上裝飾器行為(因?yàn)槭窃谝晥D入口處,分發(fā)請(qǐng)求方式前)。
4.2 在類(lèi)視圖中裝飾
在類(lèi)視圖中使用為函數(shù)視圖準(zhǔn)備的裝飾器時(shí),不能直接添加裝飾器,需要使用method_decorator將其轉(zhuǎn)換為適用于類(lèi)視圖方法的裝飾器。
method_decorator裝飾器使用name參數(shù)指明被裝飾的方法
# 為全部請(qǐng)求方法添加裝飾器 @method_decorator(my_decorator, name='dispatch') class DemoView(View): def get(self, request): print('get方法') return HttpResponse('ok') def post(self, request): print('post方法') return HttpResponse('ok') # 為特定請(qǐng)求方法添加裝飾器 @method_decorator(my_decorator, name='get') class DemoView(View): def get(self, request): print('get方法') return HttpResponse('ok') def post(self, request): print('post方法') return HttpResponse('ok')
如果需要為類(lèi)視圖的多個(gè)方法添加裝飾器,但又不是所有的方法(為所有方法添加裝飾器參考上面例子),可以直接在需要添加裝飾器的方法上使用method_decorator,如下所示
from django.utils.decorators import method_decorator # 為特定請(qǐng)求方法添加裝飾器 class DemoView(View): @method_decorator(my_decorator) # 為get方法添加了裝飾器 def get(self, request): print('get方法') return HttpResponse('ok') @method_decorator(my_decorator) # 為post方法添加了裝飾器 def post(self, request): print('post方法') return HttpResponse('ok') def put(self, request): # 沒(méi)有為put方法添加裝飾器 print('put方法') return HttpResponse('ok')
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python cv2.resize函數(shù)high和width注意事項(xiàng)說(shuō)明
這篇文章主要介紹了python cv2.resize函數(shù)high和width注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07在Python 不同級(jí)目錄之間模塊的調(diào)用方法
今天小編就為大家分享一篇在Python 不同級(jí)目錄之間模塊的調(diào)用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01跟老齊學(xué)Python之傳說(shuō)中的函數(shù)編寫(xiě)條規(guī)
在使用函數(shù)的時(shí)候,首先要把它放在對(duì)象的層面考量,它不是什么特殊的東西,盡管我們使用了不少篇幅講述它,但它終歸還是一個(gè)對(duì)象。2014-10-10Python綜合應(yīng)用名片管理系統(tǒng)案例詳解
這篇文章主要介紹了Python綜合應(yīng)用名片管理系統(tǒng),結(jié)合具體案例形式詳細(xì)分析了Python名片管理系統(tǒng)相關(guān)步驟、原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-01-01Python 比較兩個(gè)數(shù)組的元素的異同方法
下面小編就為大家?guī)?lái)一篇Python 比較兩個(gè)數(shù)組的元素的異同方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08Python學(xué)習(xí)筆記之Python的下載、腳本與交互模式、注釋
這篇文章主要介紹了Python學(xué)習(xí)筆記之Python的下載、腳本與交互模式、注釋?zhuān)疚膹幕A(chǔ)開(kāi)始學(xué)習(xí)Python,需要的朋友可以參考下2023-03-03用Python創(chuàng)建聲明性迷你語(yǔ)言的教程
這篇文章主要介紹了用Python創(chuàng)建聲明性迷你語(yǔ)言的教程,本文來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04