码迷,mamicode.com
首页 > 其他好文 > 详细

Django views 中的装饰器

时间:2019-05-26 15:38:40      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:htm   www   red   from   utils   not   request   cbv   部分   

关于装饰器

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

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 中的装饰器

标签:htm   www   red   from   utils   not   request   cbv   部分   

原文地址:https://www.cnblogs.com/dbf-/p/10926124.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!