django class类即视图类添加装饰器的几种方法
根据别人发布整理,个人爱好收集(原文: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类即视图类添加装饰器的几种方法的更多相关文章
- Django ListView DetailView等基于类的视图如何添加装饰器?
场景: Django开发中,如果我们使用了类视图,如:ListView.DetailView.UpdateView等,这时我们又想要对这个视图添加一个装饰器,来实现某种功能,这时候该怎么处理呢? 环境 ...
- python locust_TaskSet声明任务的典型方法是使用task装饰器的两种方法
为TaskSet声明任务的典型方法是使用task装饰器.该min_wait和MAX_WAIT属性也可以在使用taskset类中重写. from locust import Locust, TaskSe ...
- 通过decorators = [,] 的形式给类中的所有方法添加装饰器
给类添加装饰器有多种方法: 1.可以在类中的某个方法上边直接@添加,这个粒度细.无需详细介绍 2.也可以在类中通过 decorators=[, ]的形式添加,这样的话,类中的所有方法都会被一次性加上装 ...
- django添加装饰器
引入模块: from django.utils.decorators import method_decorator 添加:@method_decorator(func) from django.ut ...
- Cookie与Session、CBV添加装饰器
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- 添加登录装饰器的两种方式:FBV和CBV
1.FBV方式:添加验证装饰器 def auth(func): def deco(request, *args, **kwargs): u = request.get_signed_cookie('u ...
- 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 ...
- Flask如何给多个视图函数增加装饰器
这几天在学习Flask, 遇到了些小问题,比如说怎么给多个视图函数加相同的装饰器 给单独一个视图函数加装饰器的话很简单,写一个装饰器,然后直接加在原装饰器下面即可,多个的话,会报这样一个错误: 这个异 ...
- cookie,session 的概念以及在django中的用法,以及cbv装饰器用法
cookie的由来: 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后 ...
随机推荐
- ☕【Java技术指南】「编译器专题」重塑认识Java编译器的执行过程(常量优化机制)!
问题概括 静态常量可以再编译器确定字面量,但常量并不一定在编译期就确定了, 也可以在运行时确定,所以Java针对某些情况制定了常量优化机制. 常量优化机制 给一个变量赋值,如果等于号的右边是常量的表达 ...
- 题解 [NOIP2017 提高组]宝藏
传送门 这是蓝书上状压的例题啊,怎么会出现在模拟赛里 不过就算原题我也没把握写对 核心思路: 先令\(dp[s]\)为当前状态为\(s\)时的总花费最小值,\(cnt[s][i]\)为这个方案中由根节 ...
- 微信小程序 简易搜索功能实现
先看效果图 挺简单的一个实现方法,导入外部js数据,将数据通过radio-group展示出来,根据数据里的status属性判断显不显示该项. 在搜索框内实时读取输入的数据,去除空格后将数据跟js里的n ...
- 使用F#编写PowerShell模块
▲F#和PowerShell模块 作为可能是人类世界最强大的Shell,PowerShell最大的特点是能够直接在命令间传递.NET对象,而支持这种能力的命令被称作cmdlet.自己编写PowerSh ...
- Socket 网络编程和IO模型
最近做了一个织机数据采集的服务器程序. 结构也非常简单,织机上的嵌入式设备,会通过Tcp 不停的往服务器发送一些即时数据.织机大改有个几十台到几百台不定把 刨去业务,先分析一下网络层的大概情况.每台织 ...
- ARP协议工作原理实验
一.实验目的 验证"在向目的主机发送数据包时会先查询ARP高速缓存,如果ARP高速缓存中已保存了目的主机的MAC地址,不进行ARP查询,使用ARP高速缓存中的MAC地址:如果缓存中没有IP对 ...
- C# - 音乐小闹钟_BetaV3.0
时间:2017-11-22 作者:byzqy 介绍: 音乐小闹钟 BetaV3.0 新鲜出炉了,快来围观吧!上效果图: 是不是觉得顿时变得高大上了许多呢?^_^ 工具/原料: (操作系统:Window ...
- Learning ROS: Packaging your ROS project as a snap
Snaps are containerised software packages that are simple to create and install. They auto-update an ...
- vue-cli3.x中的webpack配置,优化及多页面应用开发
官方文档 vue-cli3以下版本中,关于webpack的一些配置都在config目录文件中,可是vue-cli3以上版本中,没有了config目录,那该怎么配置webpack呢? 3.x初始化项目后 ...
- vue post 请求 是 request payload 而不是 FromData ,以及 格式转换成 FromData 需要的 key value 格式
export function 方法名字(传进来要给后端的参数){ return request({ url : ' 后端提供的接口路径 ', method ...