ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

django:优雅装饰类视图的多种方法(以login_required举例)

2020-03-29 15:57:18  阅读:275  来源: 互联网

标签:函数 required 视图 method login 装饰 decorator


第一种:直接在url上下手。

    url(r'^comment/(?P<course_id>\d+)$', login_required(CommentsView.as_view()), name="comment")
  

补充说明
问题1:为什么可以这样?
回答1:
1、回忆一下装饰器的原理:将函数本身的引用作为参数传递给这个函数,由该函数定义一个同名函数,在此同名函数中进行别的操作后调用传入函数,并返回这个同名函数的引用的过程被称为:装饰。具体参考:装饰器详解
2、所以?你把被调用的函数当作参数传递给这个装饰器函数本身不就可以了?
第二种:使用method_decorator装饰器

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator


class LoginRequiredMixin(object):
    '''登录状态校验'''
    @method_decorator(login_required(login_url='/login/'))
    def dispatch(self, request, *args, **kwargs):
        return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)

补充说明

  • method_decorator装饰器,是django自带的一个装饰器,其最主要的作用就是解决装饰器不能直接的装饰类视图函数(method_decorator的作用是为函数视图装饰器补充第一个self参数)。
  • 它具有两个参数,第一个参数是:装饰器本身及它的参数;第二个参数是:给这个类中的哪个函数装饰。
  • 如果你愿意去看一下该装饰器的源码,我还是比较推荐的,所以我也为你准备了中文版:中文版:method_decorator装饰器源码解析
  • 关于dispatch()函数:在其View源码中,它是起着请求映射分发的作用的,其实在执行as_view()的时候,内部就是在执行的就是self.dispatch()方法,你可以自己重写一下,然后给重写的加上装饰器,就可以在其实施分发前进行了登录验证 了。
  • 使用说明:你需要让你的类视图函数继承:LoginRequiredMixin,且在View之前。
  • 这种方法的使用还可以用于取消部分类视图中的csrf验证(仅列举取消单个视图处理类的csrf验证,如果你需要将很多的处理类都取消csrf的话,可以使用继承)。示例如下(也可以配合method_decorator的第二个参数,直接装饰类):
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt, csrf_protect


class TestView(View):
    """取消该视图处理类中的csrf验证"""
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(TestView, self).dispatch(self, request, *args, **kwargs)

    def get(self, request):
        pass

    def post(self, request):
        pass

第三种:利用继承关系,实现在调用执行视图函数前调用login__required()

from django.contrib.auth.decorators import login_required
class LoginRequiredMixin(object):
    '''登录状态校验'''
    @classmethod
    def as_view(cls, **initkwargs):
        view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
        return login_required(view)
  • 在url最主要的还是要实现:login_required(CommentsView.as_view())
  • 而此时就是利用继承优雅的实现。
  • 使用说明:你需要让你的类视图函数继承:LoginRequiredMixin,且在View之前。

补充

  • login_required的跳转函数:你可以不指定(会使用默认的),也可以在其参数中指定,也可以在settings.LOGIN_URL指定。
  • 第三种和第二种的区别就在于:前者深入到分发过程中,在分发前做了验证;后者在分发后做的验证。

 

标签:函数,required,视图,method,login,装饰,decorator
来源: https://www.cnblogs.com/jiangxiaobo/p/12592666.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有