day20-CBV和FBV用户认证装饰器

一、前言

  我们之前写了一个利用cookie进行用户验证登录的一个例子,那么如果说我,每一个函数都要写一个验证的话,是不是太烦了,我们这边对用户认证做一个封装,我们把它封装在装饰器里面,这样的话,我们只要在函数上装饰一下就可以了,不用那么麻烦,但是装饰器有FBV和CBV两种情况,我们现在来逐一看看,这两种是如何实现的。

二、FBV用户装饰器

2.1、装饰器编写

说明:编写用户认证装饰器

def auth(func):
    def inner(request,*args,**kwargs):
        user_name = request.COOKIES.get("user_name") #获取cookie的值
        #为空表示还没有登录
        if not user_name:
            return redirect("/login/")
        return func(request,*args,**kwargs)
    return inner

2.2、装饰函数

说明:只需要在函数面前装饰一下就可以了

@auth  #装饰器
def index(request):
    user_name = request.COOKIES.get("user_name")
    return render(request,"index.html",{"user_name":user_name})

三、CBV用户装饰器

3.0、前提

说明:访问url

from django.urls import path
from app01 import views
urlpatterns = [
    path('order/',views.Order.as_view()),
]

3.1、装饰器编写

说明:跟上面的FBV是一样的,装饰器的内容也是一样的

def auth(func):
    def inner(request,*args,**kwargs):
        user_name = request.COOKIES.get("user_name") #获取cookie的值
        #为空表示还没有登录
        if not user_name:
            return redirect("/login/")
        return func(request,*args,**kwargs)
    return inner

3.2、单独装饰

说明:我只装饰类中的一个函数,只能对某个函数生效,比如我只装饰get,那么对get生效

from django import views
from django.utils.decorators import method_decorator #需要导入method_decorator

class Order(views.View):

    @method_decorator(auth)  #只装饰get方法
    def get(self,request):
        user_name = request.COOKIES.get("user_name")
        return render(request,"index.html",{"user_name":user_name})

    def post(self,request):
        user_name = request.COOKIES.get("user_name")
        return render(request,"index.html",{"user_name":user_name})

3.3、全部装饰

说明:那我如果既要装饰get方法,也要装饰post的方法,我们不能在所有的方法上都写上@method_decorator(auth),所以我们在dispatch上加上,因为dispatch这个函数是在执行所有方法之前必须执行的

from django import views
from django.utils.decorators import method_decorator

class Order(views.View):

    @method_decorator(auth)  #在dispatch加上,表示所有的方法全部装饰
    def dispatch(self, request, *args, **kwargs):
        return super(Order,self).dispatch(request,*args,**kwargs)


    def get(self,request):
        user_name = request.COOKIES.get("user_name")
        return render(request,"index.html",{"user_name":user_name})

    def post(self,request):
        user_name = request.COOKIES.get("user_name")
        return render(request,"index.html",{"user_name":user_name})

3.4、装饰类

说明:装饰类的话,也表示所有的方法全部装饰,效果跟在dispatch函数上装饰是一样的

from django import views
from django.utils.decorators import method_decorator

@method_decorator(auth,name="dispatch")  #在类上装饰,表示装饰的全部函数,当然你name后面是什么值,表示的是装饰哪个方法,比如:name="get",表示只装饰get方法
class Order(views.View):

    def get(self,request):
        user_name = request.COOKIES.get("user_name")
        return render(request,"index.html",{"user_name":user_name})

    def post(self,request):
        user_name = request.COOKIES.get("user_name")
        return render(request,"index.html",{"user_name":user_name})

 

posted @ 2018-04-08 11:25  帅丶高高  阅读(304)  评论(0编辑  收藏  举报