根据别人发布整理,个人爱好收集(原文:https://blog.csdn.net/mydistance/article/details/83958655 )

第一种:定义函数装饰器,在函数,类中使用函数装饰器

一、定义视图类

定义类视图,且类视图继承自View(举例)

from django.views.generic import View

class DemoView(View):

        """
具体的视图函数
"""

定义路由:

urlpatterns = [
# 类视图:注册
url(r'^register/$',views.DemoView.as_view()),
]

类视图的好处:
代码可读性好,类视图相对于函数视图有更高的复用性

二、视图类使用装饰器:

定义一个装饰器:

def my_decorator(func):

    def wrapper(request, *args, **kwargs):
print('自定义装饰器被调用了')
print('请求路径%s' % request.path)
return func(request, *args, **kwargs)
return wrapper

方法一:在url配置中装饰:

urlpatterns = [
# 我们在路由部分, 把定义好的装饰器添加到当前的函数上
# 这里需要注意: as_view() 会返回一个 view() 函数
# 所以我们把装饰器添加到view()函数上.
url(r'^demo/$', views.my_decorate(views.DemoView.as_view()))
]

弊端:单看视图的时候,无法知道此视图还被添加了装饰器,不利于代码的完整性;此种方法会为类视图中的所有请求方法都加上装饰器行为

方法二:调用系统的装饰器(给某个视图函数添加装饰器)
需要使用method_decorator将其转换为适用于类视图方法的装饰器,这种方法直接将装饰器应用在了具体的视图函数上,哪个视图函数需要,就给他添加。

@method_decorator(my_decorator)
def get(self, request):
print('get方法')
return HttpResponse('ok')

方法三:在类上面添加(给所有的视图函数都添加装饰器)

@method_decorator(my_decorator, name='dispatch')
class DemoView(View):

还可以列表方式并带跳转进行添加
@method_decorator([login_required(login_url='/login/'),],name='dispatch')

因为dispatch方法被 as_view() 中的 view() 调用,所以我们对这个方法添加装饰器, 也就相当于对整个类视图的方法添加装饰器。

方法四:定义装饰器时,添加一个self参数

装饰器如下:

def my_decorator(func):
# 此处增加了self
def wrapper(self, request, *args, **kwargs):
print('自定义装饰器被调用了')
print('请求路径%s' % request.path)
# 此处增加了self
return func(self, request, *args, **kwargs)
return wrapper

使用:直接用自定义装饰器装饰在函数视图上

    @my_decorator
def get(self, request):
print('get方法')
return HttpResponse('ok')

方法五:用Mixin扩展类的形式,继承多个装饰器,并为类视图中的所有函数视图添加装饰行为

假设定义了两个装饰器@my_decorator和@my_decorator2

# 第一个扩展类, 让他继承自
object class BaseView(object):
@classmethod
def as_view(cls, *args, **kwargs):
view = super().as_view(*args, **kwargs)
view = my_decorator(view)
return view
# 第二个扩展类,让他继承自object
class Base2View(object):
@classmethod
def as_view(cls, *args, **kwargs):
view = super().as_view(*args, **kwargs)
view = my_decorator2(view)
return view
# 类视图, 让他除了继承自这两个父类外, 最后继承View类.
class DemoView(BaseView, Base2View,View):
def get(self, request):
print('get方法')
return HttpResponse('ok')
def post(self, request):
print('post方法')
return HttpResponse('ok')

第二种:定义类装饰器,在函数,类中使用函数装饰器

定义类装饰器,在类中使用
class ShowClassName(object):
def __init__(self, cls):
self._cls = cls def __call__(self, a):
print('class name:', self._cls.__name__)
print('a name:', a)
print(self._cls)
return self._cls(a) class Foobar(object):
def __init__(self, a):
self.value = a def fun(self):
print(self.value) Foobar=ShowClassName(Foobar)
Foobar('woshiceshi').fun() #跟下面的使用方式是一样的 class ShowClassName(object):
def __init__(self, cls):
self._cls = cls def __call__(self, a):
print('class name:', self._cls.__name__)
print('a name:', a)
print(self._cls)
return self._cls(a) @ShowClassName
class Foobar(object):
def __init__(self, a):
self.value = a def fun(self):
print(self.value) a = Foobar('woshiceshi')
a.fun()
定义类装饰器,在函数中使用
class ShowClassName(object):
def __init__(self, cls):
self._cls = cls def __call__(self, a):
print('class name:', self._cls.__name__)
print('a name:', a)
print(self._cls)
return self._cls(a) def func_ceshi(a):
print(a) func_ceshi=ShowClassName(func_ceshi)
func_ceshi('woshiceshi') #跟下面的使用是一样的 class ShowClassName(object):
def __init__(self, cls):
self._cls = cls def __call__(self, a):
print('class name:', self._cls.__name__)
print('a name:', a)
print(self._cls)
return self._cls(a) @ShowClassName
def func_ceshi(a):
print(a) func_ceshi('woshiceshi')

django class类即视图类添加装饰器的几种方法的更多相关文章

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

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

  2. python locust_TaskSet声明任务的典型方法是使用task装饰器的两种方法

    为TaskSet声明任务的典型方法是使用task装饰器.该min_wait和MAX_WAIT属性也可以在使用taskset类中重写. from locust import Locust, TaskSe ...

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

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

  4. django添加装饰器

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

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

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

  6. 添加登录装饰器的两种方式:FBV和CBV

    1.FBV方式:添加验证装饰器 def auth(func): def deco(request, *args, **kwargs): u = request.get_signed_cookie('u ...

  7. Flask框架实现给视图函数增加装饰器操作示例

    在@app.route的情况下增加装饰器的写法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ...

  8. Flask如何给多个视图函数增加装饰器

    这几天在学习Flask, 遇到了些小问题,比如说怎么给多个视图函数加相同的装饰器 给单独一个视图函数加装饰器的话很简单,写一个装饰器,然后直接加在原装饰器下面即可,多个的话,会报这样一个错误: 这个异 ...

  9. cookie,session 的概念以及在django中的用法,以及cbv装饰器用法

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

随机推荐

  1. SQL 练习10

    查询没有学全所有课程的同学的信息 分析 先查询出所有课程的数量 select count(cid) from course 再查询出成绩表中课程数量=总课数的人员 select sid from sc ...

  2. NOIP 模拟 $15\; \text{影子}$

    题解 \(by\;zj\varphi\) 一道并查集的题 对于它路径上点权,我们可以转化一下:对于一个点,它在哪些路径上是最小的点权 那么我们排个序,从大到小加入点,每回加入时,将这个点与它所相连的且 ...

  3. 题解 God Knows

    传送门 这里有个线段树维护单调栈的神仙技巧 同机房dalao @Yubai的不同理解方式 yysy,我考场上连\(n^2\)的暴力都没搞出来 这里实际上求的是最小权极大上升子序列 但这个跟题目几乎没什 ...

  4. SSM自学笔记(三)

    5.Spring JdbcTemplate 1.Spring JdbcTemplate基本使用 1.1 JdbcTemplate概述 它是spring框架中提供的一个对象,是对原始繁琐的Jdbc AP ...

  5. 阿里云视频点播获取视频点播的video信息

    背景 因为在项目中需要使用阿里云的视频点播服务,需要获取视频点播的时长信息. 工具类 生成签名串Signature SignatureUtils.java package com.meeno.wzq. ...

  6. mac Charles抓包

    手机配置http代理 1.配置iPhone或Android 的wifi配置.首先保证Mac电脑和手机是在同一个局域网内. 2.设置手机wifi配置,在HTTP代理中选择手选代理,服务器填写Mac的IP ...

  7. asp.net core的输入模型验证

    数据验证特性RequiredAttribute:表示数据不能为空RegularExpressionAttribute:正则校验CompareAttribute:和某个属性比较RangeAttribut ...

  8. Django中的增删改查

    1.model 假设我们的model如下: 某个JobType下有很多Job. class JobType(models.Model): name = models.CharField(max_len ...

  9. CrackMe-Cycle

    转载自 OllyDBG入门教程   PS:自己逆在 最后的时候总会崩,不知道为什么. 我们输入用户名 CCDebuger,序列号 78787878,点上面那个"Check"按钮,呵 ...

  10. Scrapy启动spider出错

    python 3.7 里,async变成了关键字,所以报错. 解决方法:1回退python3.6版本. 2找到报错的那个py文件,比如manhole.py,将函数参数async改个名字(比如改成asy ...