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

浙公网安备 33010602011771号