文章目录

  • 一、什么是 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. linux lftp lftpget 命令简介
  2. python thrift demo
  3. C++中的函数汇总(新手必知)!
  4. php redis与me m,Redis(十) —— 为php增加redis扩展
  5. IDEA项目创建Mapper的xml文件的方法
  6. Java 算法 友好数
  7. iis8.5限速没有效果怎么回事_电梯为何会发生坠梯?没有安全措施吗?能在井道底安装大弹簧吗?...
  8. Linux下patch打补丁命令
  9. Eclipse下载与安装及汉化(详解版)
  10. 对我启发最大的数学学习方法
  11. 二本软件工程学生的考研逆袭之路
  12. 开源可视化bi工具有哪些,干货推荐
  13. 电商项目:畅购商城4.0
  14. shopex4.8.5 php5.6,惊爆漏洞ShopEX4.8.5隐患漏洞,最终解决方法ShopEX4.8.5安装完成后打开显示:Access denied by install.lock...
  15. 使用smartping监控服务器的网络可用性
  16. windows光标移动快捷键操作
  17. Google的恶搞新闻联播
  18. LINQ基础篇(中)
  19. 《数据库系统》(六)物理数据库设计
  20. 【网页设计】基于HTML在线商城购物项目设计与实现-----电脑商城6页带视频 带报告3000字

热门文章

  1. 二、staticMetaObject’ is not a member of **
  2. rpm 安装MySQL8
  3. ModalForm的使用
  4. MySQL中的表中增加删除字段
  5. oracle获取字符串最后一个逗号后面的字符
  6. js控制右侧滚动条事件
  7. MySQL数据库 锁
  8. python绿色版_mPython最新下载_mPython绿色版 - 软件帝
  9. 第07节 C++类的组合
  10. 前端页面与form表单提交:代码分享