CBV装饰器的三种写法

概述

CBV装饰器的装饰需要使用到method_decorator

需要导入:from django.utils.decorators import method_decorator

装饰器函数如下:

from functools import wraps
from django.shortcuts import render,redirect

# Create your views here.
def auth_check(func):
    @wraps(func)
    def wrapper(request,*args,**kwargs):
        next_url=request.get_full_path()
        if request.session.get("user"):
            return func(request,*args,**kwargs)
        else:
            return redirect('/login/?nex_url={url}'.format(url=next_url))
    return wrapper

方法1

第一种装饰器写法(在类上面装饰,指定装饰对象方法):

from django.shortcuts import render,HttpResponse,redirect
from django.utils.decorators import method_decorator
from django.views import View
from index.views import auth_check

#第一种装饰器的写法(CBV)
@method_decorator(auth_check, name="get")
@method_decorator(auth_check, name="post")
class HelloView(View):
    #很有用的方法,重写此方法能在页面渲染之前增加任何的逻辑
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self,request):
        user = request.session.get("user")
        token = request.session.get("token")
        return render(request, "hello.html", locals())

    def post(self,request):
        return HttpResponse("这里是post请求")

方法2

直接逐个方法进行装饰。

from django.shortcuts import render,HttpResponse,redirect
from django.utils.decorators import method_decorator
from django.views import View
from index.views import auth_check

#第二种装饰器的写法(CBV)
class NewsView(View):
    #很有用的方法,重写此方法能在页面渲染之前增加任何的逻辑

    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    @method_decorator(auth_check)
    def get(self,request):
        user = request.session.get("user")
        token = request.session.get("token")
        return render(request, "news.html", locals())

    @method_decorator(auth_check)
    def post(self,request):
        return HttpResponse("这里是post请求")

方法3

装饰在dispatch方法上面,会产生这个类下面的所有方法被装饰的效果。

#第三种装饰器的写法(CBV)

class IndexView(View):
    #很有用的方法,重写此方法能在页面渲染之前增加任何的逻辑
    @method_decorator(auth_check)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self,request):
        user=request.session.get("user")
        token=request.session.get("token")
        return render(request,"index.html",locals())

    def post(self,request):
        pass

示例

取消csrf验证

from django.views.generic import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt

class CSRFTestView(View):
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)
    def post(self, request):
        pass
上一篇
下一篇