Django提供了多種裝飾器, 其中l(wèi)ogin_required可能是經(jīng)常會(huì)使用到的。 這里介紹下四種使用此裝飾器的辦法。
當(dāng)然, 在使用前, 記得在工程目錄的settings.py中設(shè)置好LOGIN_URL
1. URLconf中裝飾
from django.contrib.auth.decorators import login_required, permission_required
from django.views.generic import TemplateView
from .views import VoteView
urlpatterns =[
?url(r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))),
?url(r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
]
2. 裝飾基于函數(shù)的視圖
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
@login_required
def my_view(request):
?if request.method =='GET':
? ? ?return HttpResponse('result')
3. 裝飾類的視圖
類的方法和獨(dú)立的函數(shù)不完全相同,所以你不可以直接將函數(shù)裝飾器運(yùn)用到方法上---你首先需要將它轉(zhuǎn)換成一個(gè)方法裝飾器
method_decorator裝飾器將函數(shù)裝飾器轉(zhuǎn)換成方法裝飾器,這樣它就可以用于實(shí)例方法。
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView
(1):在方法上進(jìn)行裝飾
class ProtectedView(TemplateView):
?template_name ='secret.html'
?@method_decorator(login_required)
?def dispatch(self, *args, **kwargs):
? ? ? return super(ProtectedView, self).dispatch(*args, **kwargs)
(2):也可以在類上面,傳入方法的名字
@method_decorator(login_required, name='dispatch')
classProtectedView(TemplateView):
?????template_name ='secret.html'
4. 裝飾通過Mixin類繼承來實(shí)現(xiàn)
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.views.generic import View
from.forms import MyForm
class LoginRequiredMixin(object):
?@classmethod
?def as_view(cls, **initkwargs):
??view =super(LoginRequiredMixin, cls).as_view(**initkwargs)
??return login_required(view)
class MyFormView(LoginRequiredMixin, View):
?form_class =MyForm
?initial ={'key': 'value'}
?template_name ='form_template.html'
?def get(self, request, *args, **kwargs):
? ? ? form =self.form_class(initial=self.initial)
? ? ? return render(request, self.template_name, {'form': form})
?def post(self, request, *args, **kwargs):
? ? ? # code here