一、类视图的定义和使用

在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对象

![image](file:///E:/05%20django/0921D44-01%20%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA%20%E9%85%8D%E7%BD%AE/django%E8%AE%B2%E4%B9%89/imgs/django-062.png)

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)类视图,装饰器和中间件的更多相关文章

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

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

  2. Django基础七之CBV装饰器和中间件

    Django基础七之CBV装饰器和中间件 目录 Django基础七之CBV装饰器和中间件 1. CBV加装饰器 2. Django中间件 2.1 Django中间件介绍 2.2 自定义中间件 2.2. ...

  3. python 之 Django框架(Django框架简介、视图装饰器、request对象、Response对象)

    12.33 Django框架简介: MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器( ...

  4. Django day15 (一) cbv装饰器 , 中间件

    一: 装饰器 二: 中间件

  5. django的类视图-11

    目录 1. 使用类视图 创建类视图 注册路由 类视图使用装饰器 在url中装饰 在类视图中装饰 method_decorator 的 name 参数 使用Mixin扩展类 使用函数方式定义的视图叫函数 ...

  6. django 内置用户-装饰器

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

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

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

  8. 11.python描述符---类的装饰器---@property

    描述符1.描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()这三个内置方法中的一个,描述符也被称为描述符协议(1):__ ...

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

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

  10. python使用类作为装饰器

    1.普通就是一个函数作为装饰器,也可以用类名作为装饰器. 因为类和函数都是callable的,都可以使用括号来调用运行他. 2.上上篇的缓存一段时间的还是函数作为装饰器,类只是充当了比模块更下一级的命 ...

随机推荐

  1. VSCODE常用插件使用记录

    常用必备: 1.vscode-icon 让 vscode 资源树目录加上图标,必备良品! 2.Path Intellisense 自动路劲补全,默认不带这个功能的 3.beautify Beautif ...

  2. vue04

    目录 Vue项目环境 项目的创建 vue根据配置重新构建依赖 pycharm管理vue项目 vue项目目录结构分析 vue项目生命周期 views文件夹内的.vue文件介绍 配置自定义全局样式 导航栏 ...

  3. [Algorithm] Find The Vowels

    // --- Directions // Write a function that returns the number of vowels // used in a string. Vowels ...

  4. PHP mysqli_fetch_row() 函数

    定义和用法 mysqli_fetch_row() 函数从结果集中取得一行,并作为枚举数组返回. <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con= ...

  5. JQuery动画之滑入滑出动画

    1. 滑入动画(类似于商店的卷帘门) $(selector).slideDown(speed, 回调函数); 解释: 此语句实现的功能为, 在XX时间内, 下拉动画, 显现元素. 当 slideDow ...

  6. ie8中如何使用base64

    由于ie8中不能使用jQuery2.0以上版本所以无法使用 window.btoa()加密 window.atob()解密 所以只能使用最原生的base64加密方法如下: /** * Created ...

  7. 平衡Dom总结

    介绍: 新的项目中有些Dom元素需要和画布保持统一个适配比例 项目地址: 宝岛之光-台湾偶像剧 遇到的问题 H5项目使用Canvas, 适配采用保持宽高比例, 上下或者左右留白方式 在项目中有些Dom ...

  8. UVA 12501 Bulky process of bulk reduction ——(线段树成段更新)

    和普通的线段树不同的是,查询x~y的话,给出的答案是第一个值的一倍加上第二个值的两倍一直到第n个值的n倍. 思路的话,就是关于query和pushup的方法.用一个新的变量sum记录一下这个区间里面按 ...

  9. Java web 实验三部分资料上传

    花好月圆系列 貂蝉 黄月英 孙尚香 甄姬 标准包 魏 曹操 司马懿 郭嘉 甄姬 张辽 许褚 夏侯惇 蜀 刘备 关羽 张飞 诸葛亮 黄月英 赵云 马超 吴 孙权 孙尚香 周瑜 大乔 甘宁 吕蒙 群 吕布 ...

  10. (转载)IOCP 浅析

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-iocp/#author   郭 仁祥, 软件工程师, IBM 简介: 传统的 Server/Cli ...