Django Rest Framework 源码相关

FBV和CBV区别

    CBV 内部dispatch 做了分发
    FBV没办法用类的继承,多态
    # DJango的View只做了CBV的分发
        def dispatch(self, request, *args, **kwargs):
            # GET POST
            # BookView().get
            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)

APIView 和View的区别

    -- APIView继承了View
        -- 重写了as_view方法
            -- 豁免csrf
        --  def dispatch(self, request, *args, **kwargs):
                self.args = args
                self.kwargs = kwargs
                
                # 重新封装request
                # 新的request变成 Request的实例化对象
                # 旧的request变成了_request
                request = self.initialize_request(request, *args, **kwargs)
                self.request = request
                。。。。。。
        --  def initialize_request(self, request, *args, **kwargs):
                parser_context = self.get_parser_context(request)

                return Request(
                    request,
                    parsers=self.get_parsers(),
                    authenticators=self.get_authenticators(),
                    negotiator=self.get_content_negotiator(),
                    parser_context=parser_context
                )
        -- Class Request(object):
                self._request = 旧的request
                def query_params(self):
                    return self._request.GET
                def data(self):
                    return post请求的数据

 

上一篇:day85


下一篇:unittest使用的时候,print的东西可以在html详情里面显示,但是又想打印在日志中,那就修logging模块中的info方法,使用装饰器