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})