zoukankan      html  css  js  c++  java
  • 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的执行流程

    # 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)
    

      

  • 相关阅读:
    使用某些 DOCTYPE 时会导致 document.body.scrollTop 失效
    VB.NET 笔记1
    知识管理系统Data Solution研发日记之一 场景设计与需求列出
    知识管理系统Data Solution研发日记之五 网页下载,转换,导入
    折腾了这么多年的.NET开发,也只学会了这么几招 软件开发不是生活的全部,但是好的生活全靠它了
    分享制作精良的知识管理系统 博客园博客备份程序 Site Rebuild
    知识管理系统Data Solution研发日记之四 片段式数据解决方案
    知识管理系统Data Solution研发日记之二 应用程序系列
    知识管理系统Data Solution研发日记之七 源代码与解决方案
    知识管理系统Data Solution研发日记之三 文档解决方案
  • 原文地址:https://www.cnblogs.com/wakee/p/12553402.html
Copyright © 2011-2022 走看看