1. 程式人生 > 實用技巧 >Django:類檢視的裝飾器

Django:類檢視的裝飾器

裝飾器可以應用在檢視函式上,同樣也可以應用在檢視類上。

不過有一點小區別。

用法一,在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異常,因為引數傳遞的原因。

原文:https://www.liujiangblog.com/course/django/279