Django:類檢視的裝飾器
阿新 • • 發佈:2020-12-28
裝飾器可以應用在檢視函式上,同樣也可以應用在檢視類上。
不過有一點小區別。
用法一,在URLConf中直接裝飾:
from django.contrib.auth.decorators import login_required, permission_required from django.views.generic import TemplateView from .views import VoteView urlpatterns = [ path('about/', login_required(TemplateView.as_view(template_name="secret.html"))), path('vote/', permission_required('polls.can_vote')(VoteView.as_view())), ]
用法二,在類檢視中裝飾指定的方法:
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= 'secret.html' @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super().dispatch(*args, **kwargs)
注意:
- 上面要把裝飾器用在dispatch這個方法上,才能在每次請求到達URL時,例項化類檢視時都執行這個裝飾器的功能。
- 不是每個裝飾器都能直接運用在類方法上,需要使用
method_decorator
這個裝飾器的裝飾器方法將裝飾器運用在類方法上。感覺很繞?其實就是說,我們有很多很多的裝飾器,但其中有一些不能直接裝飾dispatch這種類方法。那怎麼辦呢?套層殼!用method_decorator
有時候,簡單地用一下,可以寫成下面的精簡版:
@method_decorator(login_required, name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html'
有時候,可能你需要對一個物件應用多個裝飾器,正常做法是:
@method_decorator(never_cache, name='dispatch') @method_decorator(login_required, name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html'
為了偷懶,我們可以這麼做:
decorators = [never_cache, login_required] @method_decorator(decorators, name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html'
唯一需要注意地是裝飾器是有先後順序的。上面的例子中,never_cache
就要先於login_required
被呼叫。
最後,使用method_decorator
有時會導致TypeError
異常,因為引數傳遞的原因。