场景:在Django开发中,如果我们使用了类视图,比如ListView、DetailView、UpdateView等,然后我们想给这个视图添加一个装饰器来实现某个功能,这时候我们应该怎么做呢?环境:python3.6Django1.11wrongusagewrongimplementation:defis_login(func):defwrapper(request,*args,**kwargs):#如果没有检测到用户,则跳转到登录页面ifnotrequest.session.get("user"):returnredirect(reverse('login'))returnfunc(request,*args,**kwargs)returnwrapper@is_loginclassmyinfor(generic.ListView):passerrormessage:AttributeError:'function'对象hasNoattribute'as_view'正确用法实现方法一:fromdjango.utils.decoratorsimportmethod_decoratordefis_login(func):defwrapper(request,*args,**kwargs):#如果没有检测到用户,则跳转到登录pageifnotrequest.session.get("user"):returnredirect(reverse('login'))returnfunc(request,*args,**kwargs)returnwrapper#使用method_decorator来包装装饰器,name参数isMandatory,dispatch支持所有的请求类型,包括get、post等,如果指定了某个请求方式,则改为:name='get'。教程源码站点(bigyoung.cn)@method_decorator(is_login,name='dispatch')classmyinfor(generic.ListView):pass实现方式二:通过路由配置实现:(不推荐)'''教程源站:BigYoung.cn'''fromdjango.utils.decoratorsimportnever_cacheurlpatterns+=[path('myinfo/',never_cache(myinfor.as_view()),name='myinfo'),]高级用法:如果有多个装饰器需要装饰,怎么办?欢迎大家访问BigYoung网站(http://www.bigyoung.cn)查看....
