• 类视图引入
  • 类视图的定义与使用
  • 类视图实现的原理
  • 在类视图中使用装饰器
  • 类视图多继承&Minx扩展类
  • 中间件

类视图引入

以函数的方式定义的视图成为函数视图,函数视图便于理解。但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,就需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳

def register(request):"""处理注册"""#获取请求方法,判断是GET/POST请求if request.method == 'GET':#处理GET请求,返回注册页面return render(request, 'register.html')else:#处理POST请求,实现注册逻辑return HttpResponse('这里实现注册逻辑')

函数视图示例

在Django中也可以使用类来定义一个视图,称为类视图

def register(View):"""类视图 处理注册"""def get(self, request):"处理GET请求, 返回注册页面"return render(request, 'register.html')def post(self, request):" 处理POST请求,实现注册逻辑"return HttpResponse('这里实现注册逻辑')

类视图示例

类视图好处:

  • 代码可读性好
  • 类视图相对于函数视图通过继承具有更高的可复用性

类视图的定义与使用

我们要想使用类视图必须继承View

from django.views.generic import View

from django.views.generic import Viewclass DemoView(View):def get(self, request):return HttpResponse('get page')def post(self, request):return HttpResponse('post page')

DemoView

路由那里,我则需要使用该视图的as_view方法转换为函数

from .views import DemoViewurlpatterns = [url(r'^demo/$', DemoView.as_view(), name='demo')
]

路由配置

类视图实现的原理

按住ctrl,点击as_view

@classonlymethod
def as_view(cls, **initkwargs):"""Main entry point for a request-response process."""...def view(request, *args, **kwargs):self = cls(**initkwargs)     #cls就是DemoView类,生成对象if hasattr(self, 'get') and not hasattr(self, 'head'):self.head = self.getself.request = requestself.args = argsself.kwargs = kwargsreturn self.dispatch(request, *args, **kwargs)view.view_class = clsview.view_initkwargs = initkwargsupdate_wrapper(view, cls, updated=())update_wrapper(view, cls.dispatch, assigned=())return view   #最终还是返回函数def dispatch(self, request, *args, **kwargs):..#根据请求方法判断if request.method.lower() in self.http_method_names:handler = getattr(self, request.method.lower(), self.http_method_not_allowed)else:handler = self.http_method_not_allowedreturn handler(request, *args, **kwargs)

相关源码

在类视图中使用装饰器

我们知道在函数视图中,可以如下使用装饰器

def my_decorator(view_func):def wrapper(*args, **kwargs):print('装饰器被调用')return view_func(*args, **kwargs)return wrapper@my_decorator
def func_demo(request):return HttpResponse('func_demo')

函数视图使用装饰器

在类视图中使用为函数视图准备的装饰器时,不能直接添加装饰器,需要使用method_decorator将其转换为适用于类视图方法的装饰器。

类视图多继承& Minx扩展类

使用面向对象多继承特性,可以通过定义父类(作为扩展类),在父类中定义想要想类视图补充的方法,类视图继承这些扩展类,便可实现代码服用。定义父类名称通常以Mixin结尾

class ListModelMixin(object):"""list扩展类"""def list(self, request, *args, **kwargs):print('查询多条数据')class CreateModelMixin(object):"""create扩展类"""def create(self, request, *args, **kwargs):print('新增一条数据')class DepartmentView(CreateModelMixin, ListModelMixin, View):"""同时继承两个扩展类,复用list和create方法"""def get(self, request):self.list(request)return HttpResponse('get page')def post(self, request):self.create(request)return HttpResponse('post page')

示例

中间件

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。我们可以可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。

1、定义一个中间件,在项目中新建一个middlewares.py文件,然后在该文件中定义中间件类:

from django.utils.deprecation import MiddlewareMixin# 定义中间件类: 通过继承Django的MiddlewareMixin扩展类实现
class MyMiddleware(MiddlewareMixin):def __init__(self, get_response=None):# 服务器启动,初始化中间件类时被调用,只执行一次super().__init__(get_response)print('init')def process_request(self, request):print('before 视图')# 注意:可以返回None或者response对象,如果返回response对象,则视图函数就不会再执行了def process_response(self, request, response):print('after 视图')return response

自定义中间件

2、在settings.py文件中添加中间件

3、定义一个视图进行测试

def index(request):print('====index===')return HttpResponse('hello world')

多个中间件的执行顺序

#1、再定义一个中间件类class MyMiddleware2(MiddlewareMixin):def __init__(self, get_response=None):super().__init__(get_response)print('init 2')def process_request(self, request):print('before 视图 2')def process_response(self, request, response):print('after 视图 2')return response#2、注册MIDDLEWARE = ['django.middleware.security.SecurityMiddleware',...'middlewares.MyMiddleware',  # 注册中间件'middlewares.MyMiddleware2',  ]#3、执行结果
 before 视图before 视图 2==index==after 视图 2after 视图#4、结论
对于视图之前执行的 process_request 方法,先 注册的中间件先执行
对于视图之后执行的 process_response 方法,后 注册的中间件先执行

示例说明

转载于:https://www.cnblogs.com/sellsa/p/10745562.html

第5天:基于类的视图与中间件相关推荐

  1. FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类

    一. 概念 FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类 至于区别呢? 我觉得只是写法上的不一样, 实现的结果都 ...

  2. django 1.8 官方文档翻译: 3-4-3 使用基于类的视图处理表单

    使用基于类的视图处理表单 表单的处理通常有3 个步骤: 初始的的GET (空白或预填充的表单) 带有非法数据的POST(通常重新显示表单和错误信息) 带有合法数据的POST(处理数据并重定向) 你自己 ...

  3. django 1.8 官方文档翻译: 3-4-1 基于类的视图

    基于类的视图 视图是一个可调用对象,它接收一个请求然后返回一个响应.这个可调用对象可以不只是函数,Django 提供一些可以用作视图的类.它们允许你结构化你的视图并且利用继承和混合重用代码.后面我们将 ...

  4. as 不显示gradle视图_Python构建RESTful网络服务[Django篇:基于类视图的API]

    系列文章介绍 本系列文章将详细介绍将Django官方引导教程中的投票项目改写为RESTful网络服务.Django官方教程地址https://docs.djangoproject.com/zh-han ...

  5. django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图

    基于类的内建通用视图 编写Web应用可能是单调的,因为你需要不断的重复某一种模式. Django尝试从model和 template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历 ...

  6. Django 学习小组:基于类的通用视图详解(一)

    通过三周的时间我们开发了一个简单的个人 Blog,教程地址: 第一周:Django 学习小组:博客开发实战第一周教程 -- 编写博客的 Model 和首页面 第二周:Django 学习小组:博客开发实 ...

  7. Django 基于类的通用视图详解

    原文出处:https://segmentfault.com/a/1190000005685454 Django 学习小组:基于类的通用视图详解(一) 通过三周的时间我们开发了一个简单的个人 Blog, ...

  8. django 1.8 官方文档翻译: 3-4-5 内建基于类的视图的API

    内建基于类的视图的API 基于类的视图的API 参考.另请参见基于类的视图 的简介. 基础视图 View TemplateView RedirectView 通用的显示视图 DetailView Li ...

  9. 自学Python第二十二天- Django框架(三) AJAX、文件上传、POST 请求类型之间的转换、多APP开发、iframe、验证码、分页器、类视图、中间件、信号、日志、缓存、celery异步

    Django官方文档 django 使用 AJAX django 项目中也可以使用 ajax 技术 前端 前端和其他 web 框架一样,需要注意的是,django 接收 POST 请求时,需要 csr ...

最新文章

  1. 沃丰报告:物联网的未来
  2. rice university phd application result
  3. Android 中的Json解析工具fastjson 、序列化、反序列化
  4. Linux驱动编程 step-by-step (六) 用户地址检测 简单模块调试 以及一些杂项
  5. CodeForces - 617E XOR and Favorite Number(莫队)
  6. webView.loadUrl(file:///android_asset/table3.html)出现中文乱码的问题
  7. 【Latex】分数写法区别
  8. 20181102_WCF简单双工
  9. textarea 自动检测高度换行
  10. 36.Linux/Unix 系统编程手册(下) -- 进程资源
  11. WEB 安全之 SQL注入一 盲注
  12. 如何快速调出软键盘_软键盘怎么打开,软键盘怎么调出来【图文教程】
  13. macOS看视频卡顿如何修复
  14. 每日一题860-柠檬水找零
  15. 2016年7月的数据省市区数据
  16. 学习R语言这几本电子书就够了!
  17. iOS开发人员必看的精品资料(100个)
  18. 【hackerrank】World CodeSprint 11 T6
  19. 找工作的一些感悟——前端小菜的成长
  20. 孤岛危机估算章节没有回应

热门文章

  1. iOS多线程编程:线程同步总结 NSCondtion
  2. 一分钟了解阿里云产品:对象存储OSS概述
  3. Open NI for Kinect安装测试
  4. 监督学习应用与梯度下降
  5. 初学Windows编程笔记1——窗口和消息
  6. 【Python-ML】神经网络激励函数-Sigmoid
  7. 【正一专栏】梅西大婚——一辈子守候你都是值得的
  8. Leetcode 187. 重复的DNA序列 解题思路及C++实现
  9. 数据结构源码笔记(C语言):链接队列
  10. 接上,优化滚动的效率