第5天:基于类的视图与中间件
- 类视图引入
- 类视图的定义与使用
- 类视图实现的原理
- 在类视图中使用装饰器
- 类视图多继承&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天:基于类的视图与中间件相关推荐
- FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类
一. 概念 FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类 至于区别呢? 我觉得只是写法上的不一样, 实现的结果都 ...
- django 1.8 官方文档翻译: 3-4-3 使用基于类的视图处理表单
使用基于类的视图处理表单 表单的处理通常有3 个步骤: 初始的的GET (空白或预填充的表单) 带有非法数据的POST(通常重新显示表单和错误信息) 带有合法数据的POST(处理数据并重定向) 你自己 ...
- django 1.8 官方文档翻译: 3-4-1 基于类的视图
基于类的视图 视图是一个可调用对象,它接收一个请求然后返回一个响应.这个可调用对象可以不只是函数,Django 提供一些可以用作视图的类.它们允许你结构化你的视图并且利用继承和混合重用代码.后面我们将 ...
- as 不显示gradle视图_Python构建RESTful网络服务[Django篇:基于类视图的API]
系列文章介绍 本系列文章将详细介绍将Django官方引导教程中的投票项目改写为RESTful网络服务.Django官方教程地址https://docs.djangoproject.com/zh-han ...
- django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图
基于类的内建通用视图 编写Web应用可能是单调的,因为你需要不断的重复某一种模式. Django尝试从model和 template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历 ...
- Django 学习小组:基于类的通用视图详解(一)
通过三周的时间我们开发了一个简单的个人 Blog,教程地址: 第一周:Django 学习小组:博客开发实战第一周教程 -- 编写博客的 Model 和首页面 第二周:Django 学习小组:博客开发实 ...
- Django 基于类的通用视图详解
原文出处:https://segmentfault.com/a/1190000005685454 Django 学习小组:基于类的通用视图详解(一) 通过三周的时间我们开发了一个简单的个人 Blog, ...
- django 1.8 官方文档翻译: 3-4-5 内建基于类的视图的API
内建基于类的视图的API 基于类的视图的API 参考.另请参见基于类的视图 的简介. 基础视图 View TemplateView RedirectView 通用的显示视图 DetailView Li ...
- 自学Python第二十二天- Django框架(三) AJAX、文件上传、POST 请求类型之间的转换、多APP开发、iframe、验证码、分页器、类视图、中间件、信号、日志、缓存、celery异步
Django官方文档 django 使用 AJAX django 项目中也可以使用 ajax 技术 前端 前端和其他 web 框架一样,需要注意的是,django 接收 POST 请求时,需要 csr ...
最新文章
- 沃丰报告:物联网的未来
- rice university phd application result
- Android 中的Json解析工具fastjson 、序列化、反序列化
- Linux驱动编程 step-by-step (六) 用户地址检测 简单模块调试 以及一些杂项
- CodeForces - 617E XOR and Favorite Number(莫队)
- webView.loadUrl(file:///android_asset/table3.html)出现中文乱码的问题
- 【Latex】分数写法区别
- 20181102_WCF简单双工
- textarea 自动检测高度换行
- 36.Linux/Unix 系统编程手册(下) -- 进程资源
- WEB 安全之 SQL注入一 盲注
- 如何快速调出软键盘_软键盘怎么打开,软键盘怎么调出来【图文教程】
- macOS看视频卡顿如何修复
- 每日一题860-柠檬水找零
- 2016年7月的数据省市区数据
- 学习R语言这几本电子书就够了!
- iOS开发人员必看的精品资料(100个)
- 【hackerrank】World CodeSprint 11 T6
- 找工作的一些感悟——前端小菜的成长
- 孤岛危机估算章节没有回应