drf模块及源码

drf中的APIView请求生命周期

APIView的as_view(局部禁用csrf) =>

调用父类view中的as_view返回view()方法 =>

自己的类调用自己的dispatch方法发送请求(drf的displatch中重写了错误分支,可以判断三大认证之前的错误,保证服务端请求安全,也可以判断逻辑中的错误) =>

分发前完成request的二次封装,进行数据解析, =>

三大认证 =>

请求的实际响应(根据自己视图类的处理分发) =>

其中出现异常,就会交给异常模块处理异常 =>

响应模块完成响应 =>

渲染模块将数据渲染称json或者浏览器的方式渲染.

请求模块

from rest_framework.request import Request
class BookAPIView(APIView):
    def get(self, request, *args, **kwargs):
        return Response({
            'msg': 'apiview get ok'
        })
  • 将wsgi的request对象转换为drf的Request对象
  • 封装后的Requset对象完全兼容wsgi的request对象,并且将原request保存在新request._request中

    self._request = request

  • 重写格式化请求数据存放位置
    • 拼接参数:request.query_params

      def query_params(self):
          """
              More semantically correct name for request.GET.
              """
          return self._request.GET
    • 数据包参数:request.data
    • 参数分类更加规范,

源码分析

入口:APIView的dispatch方法的request=self.initialize_request(request, *args, **kwargs)

获取解析类:parsers=self.get_parsers()

进行局部全局默认配置查找顺序进行查找:return [parser() for parser in self.parser_classes]

#drf中的Requset中的request的gteattr
def __getattr__(self, attr):
    """
        If an attribute does not exist on this instance, then we also attempt
        to proxy it to the underlying HttpRequest object.
        """
    try:
        return getattr(self._request, attr)
    except AttributeError:
        return self.__getattribute__(attr)

解析模块

检索顺序:局部配置 => 局部配置 => 框架默认配置

局部配置

在自己app包中的view视图文件中,添加

from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
class Cars(View):
    #局部配置解析类,使用于当前视图类
    paraser_class = [JSONParser,FormParser,MultiPartParser]
全局配置

settings中配置,如果有不用的,注释就好

'DEFAULT_PARSER_CLASSES': [
    'rest_framework.parsers.JSONParser',  #application/json
    'rest_framework.parsers.FormParser',  #urlencoded
    'rest_framework.parsers.MultiPartParser'  #form-data
],

响应模块

from rest_framework.response import Response
def get(self, request, *args, **kwargs):
    # a
    response = Response(
        data={
            'msg': 'apiview get ok'
        },
        status=status.HTTP_404_NOT_FOUND,
    )
    print(response.data)
    return response
源码
class Response(SimpleTemplateResponse):
    """
    An HttpResponse that allows its data to be rendered into
    arbitrary media types.
    """
    def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):

渲染模块

局部配置

在自己app包中的view视图文件中,添加

from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class Cars(View):
    #局部配置渲染类,使用于当前视图类
    render_class = [JSONRenderer,BrowsableAPIRenderer]
全局配置

settings中配置,如果有不用的,注释就好

'DEFAULT_RENDERER_CLASSES': [
    'rest_framework.renderers.JSONRenderer',
    'rest_framework.renderers.BrowsableAPIRenderer',  # 上线后尽量关闭
],

异常模块

drf的异常处理只能处理客户端异常,自己重写一个文件用于捕获客户端以及服务端异常并显示或者保存到日志文件中.

#首先在settings中配置异常捕获方法
'EXCEPTION_HANDLER': 'api.exception.exception_handler',
    重写exception_handler方法:

自定义异常处理文件

# 一定要在settings文件中将异常模块配置自己的异常处理函数
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
def exception_handler(exc, context):
    response = drf_exception_handler(exc, context)
    detail = '%s - %s - %s' % (context.get('view'), context.get('request').method, exc)
    if not response:  # 服务端错误
        response =  Response({'detail': detail})
    else:  #客户端错误,调用drf的异常处理方法
        response.data = {'detail': detail}
    # 核心:要将response.data.get('detail')信息记录到日志文件
    # logger.waring(response.data.get('detail'))
    return response

原文地址:https://www.cnblogs.com/agsol/p/12093943.html

时间: 2024-08-30 01:11:42

drf模块及源码的相关文章

DRF之APIView源码解析

目录 Django项目中的代码如下 APIView源码解析 源码解析总结 Django项目中的代码如下 urls.py中: from django.conf.urls import url from app import views urlpatterns = [ url(r'^test/$', views.APIViewSourceCode.as_view()), ] views.py中: from rest_framework.views import APIView class APIVi

Python:线程、进程与协程(3)——Queue模块及源码分析

Queue模块是提供队列操作的模块,队列是线程间最常用的交换数据的形式.该模块提供了三种队列: Queue.Queue(maxsize):先进先出,maxsize是队列的大小,其值为非正数时为无线循环队列 Queue.LifoQueue(maxsize):后进先出,相当于栈 Queue.PriorityQueue(maxsize):优先级队列. 其中LifoQueue,PriorityQueue是Queue的子类.三者拥有以下共同的方法: qsize():返回近似的队列大小.为什么要加"近似&q

单独编译和使用webrtc音频降噪模块(附源码+测试demo)

webrtc的音频处理模块分为降噪ns,回音消除aec,回声控制acem,音频增益agc,静音检测部分.另外webrtc已经封装好了一套音频处理模块APM,如果不是有特殊必要,使用者如果要用到回声消除,音频增益等较为复杂的模块时,最好使用全部的音频处理模块二不要单独编译其中一部分以免浪费宝贵的时间. 但是音频降噪部分较为简单,用起来也就几个函数,除了需要传入的音频数据以外,需要调整的参数也就是音频采样率和降噪等级.另外这部分代码采用纯C语言语法编写,可以跨平台编译.整个算法也不算特别复杂,运行起

ubuntu系统中查看python模块的源码

案例:查看multiprocessing模块源码 1. 进入交互模式,导入模块,以multiprocessing模块为例 2. 查看multiprocessing.__file__属性,找到该模块的源码文件路径 3. 查看源码——cat  (路径名)/usr/lib/python3.5/multiprocessing/__init__.py  | more 4. 查看结果 原文地址:https://www.cnblogs.com/yblackd/p/python-multiprocessing.

VS2010版的Speex音频处理模块(附源码+测试demo)

开源的Speex代码内部包含了VS2003,05,08工程,但是直接编译总有一些要设置的地方,虽说也不是很复杂,但是对于不是很了解VS的同学来说还是要折腾一阵,所以我弄了一个可以直接使用的版本,当然是用VS2010编译的. Speex有些方面比webrtc要好,比如说可以直接对44.1KHZ采样率的音频做降噪处理,而webrtc最高只能支持32K采样率,超过了必须重采样到32K.另外接口也比较简单,代码量也较少.当然了其中还包括回声消除,静音检测,声音增益,重采样模块,如果是想了解其中内部原理的

django的restformework模块的源码分析

我们从路由函数开始分析 在我们自己定义的类中没有as_view方法的函数,所以肯定是继承了AIPView,那我们就去看下 view = super(APIView, cls).as_view(**initkwargs) 其中这句代码表示,最后它执行的是父类中的as_view方法,APIView类继承了原View类,所以查看View类中的as_view方法 由于APIView类中有自己的dispatch方法,所以是执行自己类中的dispatch 点进大写的Request()可以看到封装后的requ

DRF ---- APIview生命周期 请求/渲染/解析/异常/响应/ 模块源码 drf配置

目录 drf框架的封装风格 1. 原生Django View的源码复习 as_view源码 dispatch源码 2. ApiView的生命周期(源码) 重写的as_view源码 重写的dispatch源码 3 . 请求模块 initialize_request 源码 Request 源码 Request 下 __getattr_ 源码 总结(重点) 4. 渲染模块(了解) 5. Drf配置(重点) drf APISettings 默认配置 drf框架 自定义 全局配置 drf框架 自定义 局部

Android FM模块学习之四源码解析(三)

由于最近一直忙项目,没有时间来更新文档,今天抽空来写一点,希望大家可以学习使用! 这一章当然还是来分析FM模块的源码.FmReceiver.java publicFmReceiver(String devicePath,FmRxEvCallbacksAdaptor callback) throwsInstantiationException { mControl = new FmRxControls(); mRxEvents = new FmRxEventListner(); //registe

单独编译和使用webrtc的音频增益(agc)模块(附完整源码+测试音频文件)

webrtc的音频处理模块分为降噪ns和nsx,回音消除aec,回声控制acem,音频增益agc,静音检测部分.另外webrtc已经封装好了一套音频处理模块APM,如果不是有特殊必要,使用者如果要用到回声消除等较为复杂的模块时,最好使用全部的音频处理模块,不要单独编译其中一部分以免浪费宝贵的时间. 但是音频降噪,增益功能较为简单,还能直接使用.这部分源码是我从webrtc中抠出来,单独放到VS2010工程下使用.其中包括重采样以及滤波,降噪功能.这部分是直接复用之前的博文单独使用webrtc降噪