CBV登录装饰器

from django import views
from django.shortcuts import render,HttpResponse,redirect
from django.views import View
from functools import wraps


#cbv必须要倒的模块
from django.utils.decorators import method_decorator



# Create your views here.


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'hkj' and password == '123':
            request.session['name']='hkj'
            request.session['password']='123'
            return HttpResponse('ok')
    else:
        return render(request,'login.html')

def outer(func):
    @wraps(func)
    def inner(*args,**kwargs):
        if args[0].session.get('name'):
            return func(*args,**kwargs)
        else:
            redirect('/login')
    return inner

#单独装饰一个
@method_decorator(outer,name='get')
class A(View):
    # 拦截父类的函数分发 直接装饰分发函数 get 和post都被装饰
    @method_decorator(outer)
    def dispatch(self, request, *args, **kwargs):
        super().dispatch(request,*args,**kwargs)

    def get(self,request):
        return HttpResponse('get')
    def post(self,request):
        return HttpResponse('post')
原文地址:https://www.cnblogs.com/huikejie/p/11217903.html