一、类视图的定义和使用

在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. Rendering in UE4(Gnomon School UE4 大师课笔记)

    Rendering in UE4 Presented at the Gnomon School of VFX in January 2018, part two of the class offers ...

  2. 在maven项目中如何引入另外一个项目(转)

    原文链接:https://blog.csdn.net/jianfpeng241241/article/details/52654352 1  在Myeclipse中准备两个maven demo. , ...

  3. google chrome调试

    1,同样的代码使用firefox运行不会报错,正常运行. 2,同样的代码使用google chrome 有时候会误报网页? 如下:代码可以在 firfox edge正常运行,在chrome  oper ...

  4. 记录 vant Picker 选择器,实现三级联动,传对应省市区code值

    最近使用vant UI写移动端,感觉还不错 功能挺全的,带的还有省市区三级联动. 但是 突然遇到一个 产品要传的 省市区的code码,还和vant的 邮编不一样,我*****. 看了一下vant UI ...

  5. 编码问题2 utf-8和Unicode的区别

    utf-8和Unicode到底有什么区别?是存储方式不同?编码方式不同?它们看起来似乎很相似,但是实际上他们并不是同一个层次的概念 要想先讲清楚他们的区别,首先应该讲讲Unicode的来由. 众所周知 ...

  6. [Linux]ubuntu更改国内源

    转自: https://blog.csdn.net/qq_35451572/article/details/79516563 推荐快速更新国内源 https://blog.csdn.net/qq_35 ...

  7. python_bisect模块的使用

    这个模块只有几个函数, 一旦决定使用二分搜索时,立马要想到使用这个模块 import bisect L = [1,3,3,6,8,12,15] x = 3 x_insert_point = bisec ...

  8. windos系统下使tomcat按天生成控制台日志catalina.out

    windos系统下的tomcat默认不会记录控制台catalina.out日志,只有访问日志,不便于排错 修改启动文件 1.打开bin下面的startup.bat文件,把 call "%EX ...

  9. redis慢查询笔记

    慢查询 生命周期 两个配置 三个命令 运维经验 生命周期 1.发送命令 2,排队执行命令因为单线程 3.执行命令 4.返回结果 慢查询发生在第三阶段 客户端超时并不一定有慢查询,但慢查询是客户端超时的 ...

  10. 从JMS到KafKa

    从JMS到KafKa JMS (1)JMS概念 JMS(Java Message Service,java消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建.发 ...