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)