要将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视图类添加装饰器的更多相关文章

  1. django class类即视图类添加装饰器的几种方法

    根据别人发布整理,个人爱好收集(原文:https://blog.csdn.net/mydistance/article/details/83958655 ) 第一种:定义函数装饰器,在函数,类中使用函 ...

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

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

  3. 通过decorators = [,] 的形式给类中的所有方法添加装饰器

    给类添加装饰器有多种方法: 1.可以在类中的某个方法上边直接@添加,这个粒度细.无需详细介绍 2.也可以在类中通过 decorators=[, ]的形式添加,这样的话,类中的所有方法都会被一次性加上装 ...

  4. django添加装饰器

    引入模块: from django.utils.decorators import method_decorator 添加:@method_decorator(func) from django.ut ...

  5. django 内置用户-装饰器

    """ 一.如何给python内置用户添加额外的字段,注意一定义在没有迁移数据之前定义,否则会报错 1.在models中先调用 from django.contrib.a ...

  6. Django views 中的装饰器

    关于装饰器 示例: 有返回值的装饰器:判断用户是否登录,如果登录继续执行函数,否则跳回登录界面 def auth(func): def inner(request, *args, **kwargs): ...

  7. Cookie与Session、CBV添加装饰器

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  8. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

     1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...

  9. Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类

    一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...

随机推荐

  1. 洲阁筛 & min_25筛学习笔记

    洲阁筛 给定一个积性函数$F(n)$,求$\sum_{i = 1}^{n}F(n)$.并且$F(n)$满足在素数和素数次幂的时候易于计算. 显然有: $\sum_{i = 1}^{n} F(n) = ...

  2. 一.MySQL安装

    版本:linux7.6 一.编译安装 1.下载epel源 [root@db01 ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyu ...

  3. BUTXO详解

    在比原链中,每个交易消耗之前交易生成的BUTXO 然后生成新的 BUTXO,账户的余额即所有属于该地址的未花费 BUTXO 集合,BTM 的全局状态即当前所有未花费的BUTXO 集合.我们用一个具体的 ...

  4. 【HNOI 2016】大数

    Problem Description 小 B 有一个很大的数 \(S\),长度达到了 \(N\) 位:这个数可以看成是一个串,它可能有前导 \(0\),例如 00009312345 .小 B 还有一 ...

  5. VirtualBox中安装CentOS 7_Linux

    准备条件 在自己真实机上已经安装了VirtualBox虚拟机,具体安装方法可以参考Linux公社的文章. 下载CentOS-7的镜像 1. 在虚拟机中创建虚拟电脑 如图点击新建按钮,开始新建虚拟机电脑 ...

  6. webpack创建页面的过程

    1.项目文件夹中创建各类型文件放置的文件夹,如:iTestingWeb文件夹下创建src dist文件夹,用途:src为源码 dist为生成后的文件放置位置,然后在源码文件夹中进一步按文件类型增加文件 ...

  7. JAVA中的String类(详解)

    Java.lang.String类是final类型的,因此不可以继承这个类.不能修改这个类.String是一个类不属于基本数据类型. 可以从源码中看到,String是一个final类型. String ...

  8. 02-VC中的变量类型

    lp: long pointerb: BOOLsz: string zero(以0结尾的字符串) typedef const char* LPCSTRtypedef unsigned long DWO ...

  9. 雷林鹏分享:jQuery EasyUI 数据网格 - 创建列组合

    jQuery EasyUI 数据网格 - 创建列组合 easyui 的数据网格(DataGrid)可以创建列组合,如下所示: 在本实例中,我们使用平面数据来填充数据网格(DataGrid)的数据,并把 ...

  10. postgresql 空间函数 随笔

    1. ST_Buffer(geometry, double, [integer])buffer操作一个很有用函数,这个函数的第一个参数是要操作的空间几何数据,第二个参数长度(距离),第三个参数为一个整 ...