Django Rest Frawwork框架的CBV FBV分析
前言
web开发的两种模式
''' 在前后端不分离的引用模式中,前端页面看到的效果都是由后端控制的,由后端页面渲染或者重定向,也就是后端需要控制前端的展示, 前端与后端的耦合度很高,这种模式比较适合纯网页应用,但是后端对接APP时,App可能并不需要后端返回一个HTML网页,二仅仅是数据本身, 所以后端原本返回网页的接口不在适用前端APP应用,为了对接APP后端还需再开发一套接口。 另外前后端不分离式 Django每次返回都是render 或者redirect来返回的,需要带上HTML页面和参数 '''
在前后端分离的应用模式中,后端仅返回前端所需要的数据,不再渲染HTML页面,不再控制前端的效果,只要前端用户看到什么效果,
从后端请求的数据如何加载到前端中,都由前端自己决定,网页有网页自己的处理方式,APP有APP的处理方式,但无论哪种前端所需要的数据基本相同,
后端仅需开发一套逻辑对外提供数据即可,在前后端分离的应用模式中,<br>前端与后端的耦合度相对较低
在前后端分离的应用模式中,我们通常将后端开发的每一视图都成为一个接口,或者API,前端通过访问接口来对数据进行增删改查
如果项目的需求是后一种情况的话,那么就可以用到Django Rest Framework了
其中前后端分离可以分为FBV和CBV两种模式
# url
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
# 基于函数的视图
path('user/',views.user)
]
# view
from django.shortcuts import render,HttpResponse
import json
# FBV 模式
def user(request):
'''
如果有不同的方法 则要进行不同的判断
'''
if request.method == "GET":
return HttpResponse("GET")
if request.method == "POST":
return HttpResponse("POST")
CBV
# url
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
# CBV模式
path('people',views.PeopleView.as_view()) # 后面的as_view()要记得写上
]
# view
'''
CBV模式需要继承View
当请求是get时候 自动执行get方法
当请求是post的时候 自动执行post方法
'''
from django.views import View
# 所有CBV的都必须继承View
class PeopleView(View): # 一般喜欢在后面加个View
def get(self,request,*args,**kwargs):
return HttpResponse("GET")
def post(self,request,*args,**kwargs):
return HttpResponse("POST")
CBV的原理
基于反射实现根据请求方式不同,执行不同的方法
CBV的执行流程
# path("order",views.OrderVIew.as_view())
'''
1 url进入 点击as_view() 此地as_view()指的是View类的as_view()方法 (如果自己没有就找父类的as_view()方法)
2 as_view() 中首先判定客户端请求方式是不是django认定的那八种 不是的直接报错 是的话返回view对象
3 返回view对象之后 路由此时变成views.OrderVIew.view() 执行view函数 然后就到了dispatch
4 dispatch函数 首先判断请求方式是不是django认定的那八种方式 是的话通过放射去执行不同的方法
'''
第一步

第二步 第三步

第四步

CBV源码
class View:
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
def view(request, *args, **kwargs):
# 首先实现类的实例化 对应上面例子就是PeopleView()
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.setup(request, *args, **kwargs)
if not hasattr(self, 'request'):
raise AttributeError(
"%s instance has no 'request' attribute. Did you override "
"setup() and forget to call super()?" % cls.__name__
)
# 返回实例化后的结果 继续看dispatch
return self.dispatch(request, *args, **kwargs)
view.view_class = cls
view.view_initkwargs = initkwargs
# take name and docstring from class
update_wrapper(view, cls, updated=())
# and possible attributes set by decorators
# like csrf_exempt from dispatch
update_wrapper(view, cls.dispatch, assigned=())
# 返回视图
return 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:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)

浙公网安备 33010602011771号