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两种模式

FBV

英文全称 function base view (基于函数的视图)

# 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

class base view(基于类的视图)

案例

# 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的执行流程

url--view方法--dispatch(反射执行)

第一步

第二步

 第三步

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)

  

猜你喜欢

转载自www.cnblogs.com/wakee/p/12553402.html