Django:(05)类视图,装饰器和中间件
一、类视图的定义和使用
在Django中还可以通过类来定义一个视图,称为类视图。
定义一个类视图:定义一个类,需继承 Django 提供的 View
类 。
from django.views.generic import View
class TestView(View):
def get(self, request):
"""get请求"""
return render(request, 'index.html')
def post(self, request):
"""post请求"""
# 代码略
return HttpResponse('操作结果')
路由配置:调用类视图的 as_view()
方法
urlpatterns = [
...
url(r'^Test$', views.PostView.as_view()),
]
as_view()的作用是按照不同请求方式调用不同请求方法,详情查看 as_view() 方法源码,以及其内部调用的 dispatch()
二、类视图继承扩展类
定义的扩展父类名称通常以Mixin结尾,类视图可以直接通过多继承,继承他们的方法。
ListModelMixin
查询多条数据(列表数据)CreateModelMixin
新增一条数据RetrieveModelMixin
查询一条数据UpdateModelMixin
修改一条数据DestroyModelMixin
删改一条数据
这些 Mixin 类分别提供了不同的类视图方法{{TODO:后续补充详情}})
class DepartmentView(CreateModelMixin, ListModelMixin, View):
"""
同时继承两个扩展类
"""
def get(self, request):
# 复用父类ListModelMixin的list方法
return self.list(request)
def post(self, request):
# 复用父类CreateModelMixin的create方法
return self.create(request)
class EmployeeView(CreateModelMixin, View):
"""
继承CreateModelMixin扩展类
"""
def post(self, request):
# 复用父类ListModelMixin的list方法
return self.create(request)
三、为视图添加装饰器
装饰器:不在改变原有函数的前提下,在函数调用之前或之后执行额外的操作
1、准备一个装饰器
def check_ip(view_fun):
"""装饰器:禁止黑名单ip访问"""
def wrapper(request, *args, **kwargs):
# 在视图函数执行前做额外的操作:
# 禁止ip黑名单访问
IP = request.META.get('REMOTE_ADDR')
if IP in ['192.168.210.160']:
return HttpResponse('IP禁止访问')
return view_fun(request, *args, **kwargs)
return wrapper
2、不能直接使用我们上面的装饰器(缺少self参数)
需要使用method_decorator 装饰器,函数装饰器补充第一个self参数,使它可以应用到类的方法中。
@method_decorator(check_ip)
3、给类视图的特定的方法添加装饰器
class PostView(View):
@method_decorator(check_ip)
def post(self, request):
return HttpResponse('处理发帖操作')
4、给类视图的所有方法应用装饰器:
给 dispatch 方法加上@method_decorator(check_ip)
,就能给给类视图的所有方法应用装饰器:
class PostView(View):
@method_decorator(check_ip)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
5、另一种方式:
在类上面添加装饰器,指定对哪个方法进行装饰 :@method_decorator(装饰器名, name='视图方法名')
@method_decorator(check_ip, name='get')
class PostView(View):
def get(self, request):
return render(request, 'index.html')
def post(self, request):
return HttpResponse('操作结果')
四、Django中间件
一个轻量级、底层的插件系统,用于在视图函数调用之前或之后执行额外操作,在全局上修改Django的输入或输出。
方法名 | 作用 | 返回值 |
---|---|---|
__init__(self, get_response=None) |
服务器启动(重启)时执行一次 | 无 |
process_request(self, request) |
在视图执行之前调用 | 返回 None : 会执行视图;返回 HttpResponse : 不会再执行视图 |
process_response(self, request, response) |
在视图执行完之后调用 | 必须返回HttpResponse对象 |

1、定义中间件
通过继承Django的MiddlewareMixin
扩展类实现
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
print('before 视图')
def process_response(self, request, response):
print('after 视图')
return response # 必须要有返回值
process_request():可以返回None或者response对象,如果返回response对象,则视图函数就不会再执行了
2、在settings文件中配置
MIDDLEWARE = [
'middlewares.MyMiddleware', # 注册中间件
]
3、多个中间件的执行顺序
- 对于视图之前执行的 process_request 方法,先 注册的中间件先执行
- 对于视图之后执行的 process_response 方法,后 注册的中间件先执行
要注意多个中间件之间的依赖关系, 被依赖的中间件要声明在前面
Django:(05)类视图,装饰器和中间件的更多相关文章
- django class类即视图类添加装饰器的几种方法
根据别人发布整理,个人爱好收集(原文:https://blog.csdn.net/mydistance/article/details/83958655 ) 第一种:定义函数装饰器,在函数,类中使用函 ...
- Django基础七之CBV装饰器和中间件
Django基础七之CBV装饰器和中间件 目录 Django基础七之CBV装饰器和中间件 1. CBV加装饰器 2. Django中间件 2.1 Django中间件介绍 2.2 自定义中间件 2.2. ...
- python 之 Django框架(Django框架简介、视图装饰器、request对象、Response对象)
12.33 Django框架简介: MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器( ...
- Django day15 (一) cbv装饰器 , 中间件
一: 装饰器 二: 中间件
- django的类视图-11
目录 1. 使用类视图 创建类视图 注册路由 类视图使用装饰器 在url中装饰 在类视图中装饰 method_decorator 的 name 参数 使用Mixin扩展类 使用函数方式定义的视图叫函数 ...
- django 内置用户-装饰器
""" 一.如何给python内置用户添加额外的字段,注意一定义在没有迁移数据之前定义,否则会报错 1.在models中先调用 from django.contrib.a ...
- python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...
- 11.python描述符---类的装饰器---@property
描述符1.描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()这三个内置方法中的一个,描述符也被称为描述符协议(1):__ ...
- Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类
一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...
- python使用类作为装饰器
1.普通就是一个函数作为装饰器,也可以用类名作为装饰器. 因为类和函数都是callable的,都可以使用括号来调用运行他. 2.上上篇的缓存一段时间的还是函数作为装饰器,类只是充当了比模块更下一级的命 ...
随机推荐
- C# 数组(5) 持续更新
同一类型和不同类型的多个对象 使用同一类型的多个对象,使用集合和数组. 使用不同类型的多个对象,使用Tuple(元组). 初始化数组 ]; myArray 存放在栈中,而 myArray 的内容 放在 ...
- Java笔记(基础第一篇)
一.初识java 1.Java是一种可以编写跨平台的.面向对象的程序设计语言. Java开发分成以下3个方向: (1). java SE:主要用于桌面程序的开发.是java EE和java ME的基础 ...
- MySQL 下载与安装使用教程
MySQL 官网地址:https://www.mysql.com/ 等待下载完成 双击运行 如果有需要 我们可以新增一个用户出来 点击 Add User,不需要的话 直接 点击 next 默认的MyS ...
- flutter flutter_cupertino_date_picker 时间插件的用法
https://blog.csdn.net/sinat_37255207/article/details/100041023 https://github.com/wuzhendev/flutter- ...
- 初入SG-UAP
初入SG-UAP SpriderMan 关注 2019.06.19 14:10 字数 1130 阅读 10评论 0喜欢 0 初次接触SG-UAP,将自己的见解以文字形式记录下来,希望能对初入的伙伴们有 ...
- Dockerfile中echo使用
Dockerfile 中的echo的使用方式和bash中的使用方式是有区别的 下面是一个 Dockerfile 通过echo的方式更换apt-get源和pip源 FROM python:3.5.8-s ...
- JS核心知识点:DOM\BOM\EVENT
1.DOM(Document Object Model) :文档对象模型2. DOM节点:页面中最基本的组成部分 3. childNodes:获取某个节点下所有的子节点 在标准及ie9以上 : 会获取 ...
- SpringMVC——参数传递
一.接收零散参数 1.装配原则为传递参数名和方法接收参数名一致 2.手动装配@RequestParam name代表页面发送的参数名字 required代表参数是否必须传递 false代表可以不 ...
- 【记录】springboot项目的maven的pom.xml文件第一行报错 Unknown Error
原因 : maven的插件版本的问题,造成与IDE的不兼容 解决办法 :在pom中加上 <maven-jar-plugin.version>3.1.1</maven-jar-plug ...
- Linux下MongoDB非正常关闭启动异常解决方法
1.将配置信息写入一个文件中 vim mongo.conf 里面写如下内容: dbpath=/usr/local/mongodb/data/ logpath=/usr/local/mongodb/lo ...