文章目录

  • 一、什么是 FBV与CBV
    • FBV: function base view
    • CBV: class base view
  • 二、CBV 实现原理:反射
  • 三、CBV 面向对象
    • 1.封装
    • 2.继承
  • 四、Django 中间件方法与流程

一、什么是 FBV与CBV

FBV: function base view

views.py

from django.shortcuts import render,HttpResponse
import jsondef users(request):    user_list = {"name": "tom","age":27}return HttpResponse(json.dumps(user_list))

urls.py

from django.contrib import admin
from django.urls import path
from tutorial01 import viewsurlpatterns = [path('users',views.users),path('admin/', admin.site.urls),
]

CBV: class base view

推荐使用CBV

views.py

from django.shortcuts import render,HttpResponse
from django.views import Viewclass UsersView(View):# 如何知道数据传输方法?# 通过反射实现# getattr(obj, request.method)def get(self, request, *args, **kwargs):return HttpResponse("GET")def post(self, request, *args, **kwargs):return HttpResponse("POST")

urls.py

from django.contrib import admin
from django.urls import path
from tutorial01 import viewsurlpatterns = [path('users',views.UsersView.as_view()),path('admin/', admin.site.urls),
]

二、CBV 实现原理:反射

反射机制就是在运行时,动态的确定对象的类型,并可以通过字符串调用对象属性、方法、导入模块,是一种基于字符串的事件驱动。

在python中支持反射机制的函数有getattr()、setattr()、delattr()、exec()、eval()、__import__

CBV 基于反射来根据请求方式不同,执行不同方法

ChildView 子类继承 View 父类后,

浏览器通过url传给路由,由as_view 进入ChildView,ChildView通过View的 dispatch 方法来根据不同请求方法执行不同的方法

class View:# ...def dispatch(self, request, *args, **kwargs):# Try to dispatch to the right method; if a method doesn't exist,# defer to the error handler. Also defer to the error handler if the# request method isn't on the approved list.if request.method.lower() in self.http_method_names:# 通过 getattr 实现反射机制handler = getattr(self, request.method.lower(), self.http_method_not_allowed)else:handler = self.http_method_not_allowedreturn handler(request, *args, **kwargs)

三、CBV 面向对象

1.封装

  • 同一类方法封装到类中

    class File:// 文件增删改查方法def add:passdef delete:passdef update:passdef query:pass
    class DB:// 数据库增删改查方法def add:passdef delete:passdef update:passdef query:pass
    
  • 将数据封装到对象中

    class DB:// 文件增删改查方法def __init__(self, username, password):self.username = usernameself.password = passworddef add:passdef delete:passdef update:passdef query:pass
    obj1 = File('baimoc','123')
    

2.继承

避免重复编写共用的功能

class MyBaseView(object):def dispatch(self, request, *args, **kwargs):print('before')# 执行父类的 dispatch 方法# super 除了可以让子类继承父类的方法,同时还可以执行子类的其他父类的 方法ret = super(MyBaseView, self).dispatch(request, *args, **kwargs)print('after')return ret# 继承时,前面的类优先级高
class UsersView(MyBaseView, View):def get(self, request, *args, **kwargs):print('get')return HttpResponse("GET")def post(self, request, *args, **kwargs):return HttpResponse("POST")

输出

Quit the server with CTRL-BREAK.
before
get
after

四、Django 中间件方法与流程

中间件负责把各个模块将客户端请求经过路由匹配和视图处理返回给客户端

包括五个方法

  • process_request
  • process_response
  • process_view
  • process_exception
  • process_render_template

执行流程

Django REST 框架的 FBV 与 CBV 选择相关推荐

  1. django请求生命周期,FBV和CBV,ORM拾遗,Git

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post ...

  2. python 全栈开发,Day84(django请求生命周期,FBV和CBV,ORM拾遗,Git)

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post ...

  3. django之路由分组,路由分发,FBV,CBV,ORM框架

    今日的内容: a. 路由系统1. 创建app2. 路由的分组3. 路由的分发- 正则表达式匹配b. django的orm(模型model)1. 创建模型的步骤2. orm基本的增删改查3. 正向查询和 ...

  4. Web框架之Django_03 路由层了解(路有层 无名分组、有名分组、反向解析、路由分发 视图层 JsonResponse,FBV、CBV、文件上传)

    阅读目录 一.路由层:(Django的路由系统) 二.伪静态网页和虚拟环境: 三.FBV与CBV.JsonResponse.文件上传 一.路由层:(Django的路由系统) URL配置(Django项 ...

  5. django之视图系统 views.py--主要内容(FBV和CBV、dispath、request对象和request.FILES、JsonResponse)...

    django之视图系统 views.py-->主要内容(FBV和CBV.dispath.request对象和request.FILES.JsonResponse) 一个视图函数(类),简称视图, ...

  6. Django06:视图层/上传文件/request 方法补充/FBV与CBV

    三板斧 HttpResponse, 返回字符串类型render, 返回html页面,而且在返回给浏览器之前,可以给html文件传值redirect 重定向 总结:视图函数必须返回一个HttpRespo ...

  7. 记Angular与Django REST框架的一次合作(2):前端组件化——Angular

    注:这是这个系列的第二部分,主要集中在Angular的使用方面.之前使用过AngularJS(Angular 1.x),混在Django的模板中使用,这些页面一般完全是结果展示页.在有Django表单 ...

  8. Django web 框架学习之旅(3)

    <Django Web 框架> 目录 静态文件 Django中的应用 - app 什么是应用(app) 创建应用app Django应用的结构组成 数据库 和 模型 Django下使用my ...

  9. 什么是FBV和CBV?

    在早期,视图开发的过程中存在一些常见的语法和模式,于是引入基于函数的通用视图来抽象这些模式,并简化了常见情况下的视图开发.因此,刚开始的时候只有FBV,而Django所做的事情就是向你定义的视图函数传 ...

最新文章

  1. SVN系列操作(二)svn不显示图标的解决方法
  2. 【数字信号处理】离散时间系统 ( 离散时间系统概念 | 线性时不变系统 LTI - Linear time-invariant )
  3. 利用ArcMap对tiff或jpg格式地图图片的配准步骤
  4. EhCache的配置
  5. 第一次作业-李纯锐201731084433
  6. java中有cin格式吗,C中std :: cin对象的规则是什么?
  7. filter和map的区别
  8. 20190228 搭建Hadoop基础环境
  9. java提高代码质量的小技巧,10个 Javascript 小技巧帮你提升代码质量
  10. Keras深度学习实战(2)——使用Keras构建神经网络
  11. 11.消息摘要算法之MD5
  12. 如何使用MATLAB绘制出好看的火山图
  13. Mac10.14版本安装虚拟机Parallels Desktop 14和windows7 64位旗舰版镜像
  14. Vscode 配置默认浏览器打开
  15. jxl获取excel超级链接
  16. 51单片机 数码管中断操作
  17. 中荣股份上市首日破发:市值相对蒸发约3亿元,黄焕然为实控人
  18. 线性代数考研笔记(一)
  19. php爬虫抓取信息及反爬虫相关
  20. 51单片机控制系统的人机交互接口设计【51单片机与LED数码管的动态显示接口案例分析】

热门文章

  1. kubernetes 之QoS服务质量管理
  2. Quick Reference 代码速查表
  3. 并行算法设计与性能优化 刘文志 第2章 现代处理器特性
  4. 青少年护眼灯哪个牌子好?青少年护眼灯品牌排行榜
  5. Windows中cl命令编译运行C++
  6. 关于0x3f和0x3f3f3f3f
  7. 国外网络需要验证中国手机号码的格式(获取手机的验证码时)(kaggle 收不到手机验证码)
  8. 如何使用Java+SSM(Spring+SpringMVC+Mybatis)开发个性化新闻推荐系统 在线新闻推荐系统 基于用户项目协同过滤、内容、聚类、关联规则推荐算法实现WebNewsRSMEx
  9. java项目-第61期基于ssm项目在线心理测评系统
  10. Proteus中的继电器在哪里