Django框架中CBV和FBV的装饰器,用户验证登录

在实现用户登录的时候,我们需要判断用户是否是管理员,加入有很多的管理员,那么我们就会出现很多次判断的代码,为了减少重复的代码,我们可以对判断的代码做一个封装,简单来说就是做一个装饰器,我们先来看看FBV是如何实现的:

def auth(func):
    def inner(request,*args,**kwargs):
        # 在这里进行判断
        c = request.COOKIES.get('username')
        if not c:
            return redirect('/login/')
        return func(request,*args,**kwargs)
    return inner

@auth
def index(request):
    c = request.COOKIES.get('username')
    #page_count=int(request.COOKIES.get('page_count')) #拿到客户端设置的cookie,显示的内容数量
    cur_page=int(request.GET.get('p',1)) #获取的p为字符串,直接转换为int
    obj=Page(cur_page,len(LIST))
    data = LIST[obj.start:obj.end]  #[1:11]、[11:21]...
    return render(request,'index.html',{'li':data,'page_html':obj.content,'c':c})

接着我们来看一下CBV该如何设置,现在我只想对get请求做判断,可以使用django为我们提供的一个方法:

def auth(func):
    def inner(request,*args,**kwargs):
        # 在这里进行判断
        c = request.COOKIES.get('username')
        if not c:
            return redirect('/login/')
        return func(request,*args,**kwargs)
    return inner

from django import views
from django.utils.decorators import method_decorator
class Author(views.View):
    @method_decorator(auth)
    def get(self,request):
        c = request.COOKIES.get('username')
        return render(request,'index.html',{'c':c})
    def post(self,request):
        pass

使用@method_decorator(auth)的方式将我们上面的auth装饰器添加进去就可以了,这仅仅是对get请求做判断。现在如果请求方式很多,相对所有的方法都做认证,那么不要一一添加,可以在dispatch函数上修改,不管什么方式都会经过这个函数处理,前面说过有特别的用途,可以添加一些附加的功能,现在就是时候了:

from django import views
from django.utils.decorators import method_decorator
class Author(views.View):
    @method_decorator(auth)
    def dispatch(self, request, *args, **kwargs):
        return super(Author,self).dispatch(request, *args, **kwargs)
    def get(self,request):
        c = request.COOKIES.get('username')
        return render(request,'index.html',{'c':c})
    def post(self,request):
        pass

这样所有不管什么请求过来都会进行验证,如果觉得这种方法不太好的话,还有另外一种方式,我们可以直接把装饰器添加在类上

from django import views
from django.utils.decorators import method_decorator
@method_decorator(auth,name='dispatch') #对Author中的dispatch方法惊醒装饰
class Author(views.View):
    def get(self,request):
        c = request.COOKIES.get('username')
        return render(request,'index.html',{'c':c})
    def post(self,request):
        pass

发表评论