Django ListView DetailView等基于类的视图如何添加装饰器?

ByteLunarRhapsody
• 阅读 1460

场景:

Django开发中,如果我们使用了类视图,如:ListView、DetailView、UpdateView等,这时我们又想要对这个视图添加一个装饰器,来实现某种功能,这时候该怎么处理呢?

环境:

python 3.6

Django 1.11

错误用法

错误实现方式:

def is_login(func): 
    def wrapper(request,*args,**kwargs): 
    # 若检测不到用户就跳转登录页面 
        if not request.session.get("user"): 
            return redirect(reverse('login')) 
        return  func(request,*args, **kwargs) 
    return wrapper 

@is_login 
class myinfor(generic.ListView): 
    pass

报错信息:

AttributeError: 'function' object has no attribute 'as_view'

正确用法

实现方式一:

from django.utils.decorators import method_decorator 


def is_login(func): 
    def wrapper(request,*args,**kwargs): 
    # 若检测不到用户就跳转登录页面 
        if not request.session.get("user"): 
            return redirect(reverse('login')) 
        return  func(request,*args, **kwargs) 
    return wrapper 
    
# 使用method_decorator将装饰器包裹起来,同时,name参数是必须的,dispatch支持所有请求类型,包含get、post等,如果指定某种请求方式改为:name='get'. 教程源站(bigyoung.cn)

@method_decorator(is_login, name='dispatch') 
class myinfor(generic.ListView): 
    pass

实现方式二:

通过路由配置实现:(不推荐)

'''教程源站:BigYoung.cn'''

from django.utils.decorators import never_cache

urlpatterns += [
    path('myinfo/', never_cache(myinfor.as_view()), name='myinfo'),
]

进阶用法:

如果你有多个装饰器需要装饰,该如何操作呢?
欢迎大家访问BigYoung小站(http://www.bigyoung.cn)查看完...

本文首发于BigYoung小站
点赞
收藏
评论区
推荐文章
皕杰报表小结
1.在使用皕杰报表时,我们会发现皕杰报表总共有下列五个视图区我们可以关闭或打开每个视图区,方便我们的报表设计。有的时候我们关闭了某个视图的话,我们可以通过点击左上角的视图菜单来重新打开我们所需要用的视图区域。这时候我们点击每个视图的左上角就会发现有分离按钮
Stella981 Stella981
4年前
Graphics View绘图架构(二)
GraphicsView结构的主要类包括:视图类QGraphicsView、场景类QGraphicsScene、和各种图形项类(基类都是QGraphicsItem)1\.QGraphicsView用于观察一个场景的物理窗口  场景小于视图,整个场景在视图中可见;当场景大于视图时,试图自动提供卷滚条  QGraphicsView的视口坐标等
Stella981 Stella981
4年前
Django 基于类的视图源码分析 二
源码分析抽象类和常用视图(base.py)这个文件包含视图的顶级抽象类(View),基于模板的工具类(TemplateResponseMixin),模板视图(TemplateView)和重定向视图(RedirectView)。!base.py(http://static.oschina.net/u
Stella981 Stella981
4年前
Django—中间件
CBV加装饰器(session)要在CBV视图中使用我们上面的check\_login装饰器,有以下三种方式:fromdjango.utils.decoratorsimportmethod\_decoratorfromdjango.shortcutsimportrender,redirect,
Stella981 Stella981
4年前
Django的View(视图)和路由系统
一、Django的View(视图)1、介绍一个视图函数(类),简称视图,是一个简单的Python函数(类),它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只
Stella981 Stella981
4年前
Django 基于类的视图源码分析 一
基于类的视图(Classbasedview)是Django1.3引入的新的视图编写方式,用于取代以前基于函数(Functionbased)方式。借助于OO和Python中方便的多重继承特性,基于类的视图可以提供更好的抽象与复用能力。新的通用视图将更加优雅。Django的文档较为丰富,但在实际开发中往往仍显得不够,很多时候还是需要深入到源代码当
Stella981 Stella981
4年前
Django的rest_framework认证组件之局部设置源码解析
前言:  Django的rest\_framework组件的功能很强大,今天来我来给大家剖析一下认证组件下面进入正文分析,我们从视图开始,一步一步来剖析认证组件1、进入urls文件url(r'^login/',views.LoginCBV.as_view(),name"login"),2、然后执行LoginCBV这个类的as\
Stella981 Stella981
4年前
Django 基于类的视图源码分析 三
列表类通用视图(list.py)此文件包含用于显示数据列表常用的类和工具类。不仅可以方便的用于显示基于模型(Model)的数据列表,也可以用于显示自定义数据列表。!list.py类图(http://static.oschina.net/uploads/space/2013/0219/161042_iKka_233
Stella981 Stella981
4年前
Python装饰器用法实例总结
一、装饰器是什么python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。简单的说装饰器就是一个用来返回函数的函数。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离
Stella981 Stella981
4年前
Django【十二】中间价
一前戏  我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面。我们通过给几个特定视图函数加装饰器实现了这个需求。但是以后添加的视图函数可能也需要加上装饰器,这样是不是稍微有点繁琐。  学完今天的内容之后呢,我们就可以用更适宜的方式来实现类似给所有请求都做相同操作的功能了二中间
鸿蒙跨端实践-布局方案介绍
作者:京东科技刘宁一、前言动态化使用jue语言(开发风格与Vue一致)开发,对于视图的布局采用了标准的Flex布局方式。对于列表类视图,动态化提供了、、、等标签,将子视图的布局管理封装到标签中实现,业务只需要针对标签简单地设置相关属性,即可实现列表类布局,