概述
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