python(Django之Cookie的FBV和CBV)

FBV:

  

def Auth(func):
    '''
    :param func: 用于用户认证,只有用登录后才能访问页面
    当用户打开除登录页面的其它所有网页时候,只要应用了装饰器Auth方法,必须走以下几步
    :return:
    '''
    def inner(request,*args,**kwargs):
        #获取用户登录成功后设置的username
        v = request.COOKIES.get("username")
        #如果没有就自动返回登录页面
        if not v:
            return redirect("/cmdb/login")
        return func(request,*args,**kwargs)
    return inner

  应用:

@Auth
def index(request):
    return render(request,"index.html")

 

CBV:

   只对get请求做验证。

class Order(views.View):

    # @method_decorator(auth)
    # def dispatch(self, request, *args, **kwargs):
    #     return super(Order,self).dispatch(request, *args, **kwargs)

    # @method_decorator(auth)
    def get(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        if not v:
            return redirect("/login/")
        return render(reqeust,'index.html',{'current_user': v})

    def post(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

 

 

 

情况二:

  如果我就写了一个Auth认证装饰器,但是我想给CBV下的get方法做认证怎办呢。 

def Auth(func):
    '''
    :param func: 用于用户认证,只有用登录后才能访问页面
    当用户打开除登录页面的其它所有网页时候,只要应用了装饰器Auth方法,必须走以下几步
    :return:
    '''
    def inner(request,*args,**kwargs):
        #获取用户登录成功后设置的username
        v = request.COOKIES.get("username")
        #如果没有就自动返回登录页面
        if not v:
            return redirect("/cmdb/login")
        return func(request,*args,**kwargs)
    return inner

 

CBV写法:

from django import views
from django.utils.decorators import method_decorator
class Order(views.View):
    @method_decorator(Auth)
    def get(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

    def post(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

 

 

 

对post请求或者其它方法做认证(Auth就是上面写的认证装饰器):

class Order(views.View):
    @method_decorator(Auth)
    def dispatch(self, request, *args, **kwargs):
         return super(Order,self).dispatch(request, *args, **kwargs)

    def get(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

    def post(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

 

 

 

 

还有别上面这个继承更好的方法,如下:

@method_decorator(Auth,name='dispatch')
class Order(views.View):
    def get(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

    def post(self,reqeust):
        v = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

 

posted @ 2017-02-16 20:42  Charles.L  阅读(132)  评论(0)    收藏  举报