给django视图类添加装饰器
要将login_required装饰到view class的dispatch方法上,
因为dispatch方法为类方法,不是单个的函数,所以需要将装饰函数的装饰器 login_required转化为装饰类方法的装饰器,就要用到method_decorator .
method_decorator的参数可以是单个装饰器,也可是一个装饰器组成的列表
from django.views.generic import View
from django.contrib.auth.decorator import login_required
from django.utils.decorators import method_decorator
from django.contrib.auth.decorator import login_required,permission_required
class MyView(View):
@method_decorator(login_required)
def dispatch(self,*args,**kwargs):
return super(MyView,self).dispatch(*args,**kwargs)
def get(self,request):
pass
将装饰器装饰到dispatch方法上,就相当于将装饰器装饰到该class的所有方法上,等效于:
@method_decorator(permission_required('patient.session'),name="dispatch")
class MyView(View):
def get(self,request):
pass
如果只想应用于class中的某个方法中,可以直接装饰于该方法上
class MyView(View):
@method_decorator(login_required)
def get(self,request):
pass
装饰器 :
简单的装饰器形式为:
def my_decorator(func):
def _wrapped_view(*args,**kwargs):
"do something "
res=func(*args,**kwargs)
"do other thing with the res "
return "changed res"
return _wrapped_view
在方法内部定义一个函数,并将内部函数作为返回值
这种方式是不改变被装饰的函数,但是返回一个具有额外属性的新函数来替换它,有时候我们想查看原函数的一些信息,比如 help(),name等信息
这时,就返回装饰器内部定义函数的帮助信息和函数名,与我们原来的期待不一致。为了使被装饰后的函数,在查看函数自身的一些信息时,仍能获得
期待的返回信息,需要使用functools.wraps
对于带参数的装饰器只需在外部再嵌套一层函数:
from functools import wraps
def for_some_use(some_params):
def my_decorator(func):
@wraps(func)
def _wrapped_view(*args,**kwargs):
if some_params:
print("not change the func")
return func(*args,**kwargs)
else:
"do something "
res=func(*args,**kwargs)
"do other thing with the res "
return "changed res"
return _wrapped_view
在一个方法上装饰多个装饰器,函数的定义是 最上面的装饰器在最外层,最靠近被装饰的函数的装饰器最先执行。
对于这样的形式:
@my_decorator1
@my_decorator2
@my_decorator3
def my_func():
pass
相当于my_decorator1(my_decorator2(my_decorato3(my_func)))
给django视图类添加装饰器的更多相关文章
- django class类即视图类添加装饰器的几种方法
根据别人发布整理,个人爱好收集(原文:https://blog.csdn.net/mydistance/article/details/83958655 ) 第一种:定义函数装饰器,在函数,类中使用函 ...
- Django ListView DetailView等基于类的视图如何添加装饰器?
场景: Django开发中,如果我们使用了类视图,如:ListView.DetailView.UpdateView等,这时我们又想要对这个视图添加一个装饰器,来实现某种功能,这时候该怎么处理呢? 环境 ...
- 通过decorators = [,] 的形式给类中的所有方法添加装饰器
给类添加装饰器有多种方法: 1.可以在类中的某个方法上边直接@添加,这个粒度细.无需详细介绍 2.也可以在类中通过 decorators=[, ]的形式添加,这样的话,类中的所有方法都会被一次性加上装 ...
- django添加装饰器
引入模块: from django.utils.decorators import method_decorator 添加:@method_decorator(func) from django.ut ...
- django 内置用户-装饰器
""" 一.如何给python内置用户添加额外的字段,注意一定义在没有迁移数据之前定义,否则会报错 1.在models中先调用 from django.contrib.a ...
- Django views 中的装饰器
关于装饰器 示例: 有返回值的装饰器:判断用户是否登录,如果登录继续执行函数,否则跳回登录界面 def auth(func): def inner(request, *args, **kwargs): ...
- Cookie与Session、CBV添加装饰器
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...
- Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类
一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...
随机推荐
- eclipse juint4 出错!!!
今天在学习javaee,调用方法的时候突然出现这个错误,之前还好使,调用了几次就不好使了,我查了很多问题,据说是harmcrest的jar包没有导进来,或者是junit的jar包版本太低了,我过段时间 ...
- 微信小程序框架集合
UI组件 weui-wxss ★852 - 同微信原生视觉体验一致的基础样式库 Wa-UI ★122 - 针对微信小程序整合的一套UI库 wx-charts ★105 - 微信小程序图表工具 wema ...
- 【转】java线上程序排错经验2 - 线程堆栈分析
前言 在线上的程序中,我们可能经常会碰到程序卡死或者执行很慢的情况,这时候我们希望知道是代码哪里的问题,我们或许迫切希望得到代码运行到哪里了,是哪一步很慢,是否是进入了死循环,或者是否哪一段代码有问题 ...
- mybatis之Mybatis_demo
这篇博文通过简单的CRUD案例,让大家能够快速的上手,使用mybatis. 1,在eclipse中新建java project项目 mybatis_demo 2,在mybatis_demo项目中建 ...
- wireshark基础学习—第二部分wireshark的基础操作
抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接口.点击Capture Opti ...
- Ubuntu下的Selenium爬虫的配置
在服务器Ubuntu系统上跑爬虫,爬虫是基于Selenium写的,遇到好几个问题,现在这里记录一下. 1. 安装环境 阿里云,Ubuntu16.04,因为没有界面,所以远程命令行操作.爬虫是基于Sel ...
- 整合SSH框架实现简单登录
SSH整合的大体结构:我们将Struts2和hibernate交给spring来管理 创建好web项目之后,首先当然是先引入需要的pom节点,需要的pom的节点可以在Maven官方仓库中下载https ...
- C语言多种方法求解字符串编辑距离问题的代码
把做工程过程经常用的内容记录起来,如下内容段是关于C语言多种方法求解字符串编辑距离问题的内容. { if(xbeg > xend) { if(ybeg > yend) return 0; ...
- Ubuntu - Start - 必要软件安装
1.安装Chromium浏览器 sudo apt install chromium-browser 如果出错, 先更新下apt sudo apt update 2. 安装rime输入法 sudo ap ...
- Spring mvc集成log4j2
前期环境 Spring mvc + Maven + Idea 一.下面开始配置log4j2,先简单演示其如何配置,再仔细了解log4j2用法. 1.1 配置pom.xml,引用log4j2相关包 & ...