Django views 中的装饰器

Posted dbf-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django views 中的装饰器相关的知识,希望对你有一定的参考价值。

关于装饰器

示例:
有返回值的装饰器:判断用户是否登录,如果登录继续执行函数,否则跳回登录界面

def auth(func):
    def inner(request, *args, **kwargs):
        username = request.COOKIES.get('username')
        if not username:
            # 如果无法获取 'username' COOKIES,就跳转到 '/login.html'
            return redirect('/login.html')
        # 原函数执行前
        res = func(request, *args, **kwargs)
        # 原函数执行后
        return res
    return inner

FBV:

直接在需要装饰到函数上面加上@auth

@auth
def index(request):
    return render(request, 'index.html')

CBV:

关于 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('username')
        return render(reqeust,'index.html',{'current_user': v})

    def post(self,reqeust):
        v = reqeust.COOKIES.get('username')
        return render(reqeust,'index.html',{'current_user': v})
需要给所有方法加上装饰器

通过 dispatch 实现

from django import views
from django.utils.decorators import method_decorator


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('username')
        return render(reqeust,'index.html',{'current_user': v})

    def post(self,reqeust):
        v = reqeust.COOKIES.get('username')
        return render(reqeust,'index.html',{'current_user': v})

直接在类上给 dispatch 添加装饰器

from django import views
from django.utils.decorators import method_decorator


@method_decorator(auth,name='dispatch')
class Order(views.View):

    def get(self,reqeust):
        v = reqeust.COOKIES.get('username')
        return render(reqeust,'index.html',{'current_user': v})

    def post(self,reqeust):
        v = reqeust.COOKIES.get('username')
        return render(reqeust,'index.html',{'current_user': v})

以上是关于Django views 中的装饰器的主要内容,如果未能解决你的问题,请参考以下文章

django view 装饰器

Django内置auth模块中login_required装饰器用于类视图的优雅方式

在django中应用装饰器

django补充CBV和FBV模式

Django:(05)类视图,装饰器和中间件

装饰器 以及 django 中的应用