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

第一种:直接在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自带的一个装饰器,其最主要的作用就是解决装饰器不能直接的装饰类函数。
  • 它具有两个参数,第一个参数是:装饰器本身及它的参数;第二个参数是:请求方式(如果你不指定,默认所有请求方式)
  • dispatch()函数及函数内部的写法都是固定的,如果没有特殊需求的话,就不要篡改。
  • 如果你愿意去看一下该装饰器的源码,我还是比较推荐的,所以我也为你准备了中文版:中文版:method_decorator装饰器源码解析
  • 使用说明:你需要让你的类视图函数继承:LoginRequiredMixin,且在View之前。

第三种:利用继承关系,实现在调用View的as_view()之前调用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指定。
发布了55 篇原创文章 · 获赞 3 · 访问量 2713

猜你喜欢

转载自blog.csdn.net/rusi__/article/details/104023702