文章目录

  • 一、什么是 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. 计算机控制里ddc什么缩略语,空调自动化术语和缩略语.doc
  2. python find函数实现原理_非常干货:Python 探针实现原理
  3. 地方微信群分享小程序源码,自带流量主独立版
  4. mysql的order by,group by和distinct优化
  5. string是python内置函数吗_Python 字符串与内置函数(方法)
  6. 根据自身工作经验总结的一个工作问题解决思路
  7. springboot学习笔记03 整合JPA
  8. did you register the component correctly? For recursive components, make sure to provide the name
  9. 读书笔记 - 《疯狂的站长》
  10. jenkins pipeline分目录检出多代码库方法
  11. vf程序设计与c语言,全国计算机等级考试vf和C语言哪个更好
  12. C++如何判断一个程序是 死锁 还是 死循环,如何进行问题定位与分析
  13. 桌面级显卡天梯图(显卡性能对比图.2018.11)
  14. 西南民族大学第十届校赛 题解
  15. 主动式PFC与被动式FPC浅析
  16. JavaCV - 图像色温调整
  17. 保护云端数据安全的方法,主要有哪几种?
  18. Java Comparator使用指南 ---- 看这一篇就够了
  19. 第三十四章 数论——高斯消元解线性方程组
  20. 百度排名批量查询_一篇文章讲透百度霸屏引流细节思路与极其简单的操作玩法...

热门文章

  1. 2范数和F范数的区别
  2. liunx下查看tomcat占用的端口号
  3. LeetCode 1006.笨阶乘
  4. PATH,PYTHONPATH 与sys.path的区别
  5. 【AUDIO音频兴趣拓展】如何测试喇叭端功率?音频功放输出端测试到波形为方波
  6. RISC-V扩展指令示例
  7. H5项目常见问题汇总及解决方案 1
  8. 欧拉路和欧拉回路知识
  9. 对学校的希望和寄语_给学校的祝福语
  10. 将等号作为键值的js字符串转json