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)
    

      

  • 相关阅读:
    缓慢变化纬的解决方法
    行转列且有序
    异常处理
    继承
    js的隐式转化
    初步了解微任务
    axios中断请求AbortController
    Vue解决V-HTML指令潜在的XSS攻击('v-html' directive can lead to XSS attack vue/no-v-html)
    axios下载后台传过来的流文件并设置下载文件名(如excel)
    axios异步获取文件流数据
  • 原文地址:https://www.cnblogs.com/wakee/p/12553402.html
Copyright © 2011-2022 走看看