首页 > 编程语言 >drf源码剖析----解析器

drf源码剖析----解析器

时间:2024-03-11 21:45:34浏览次数:29  
标签:解析器 self parser request ---- 源码 context ._ data

点击查看代码
class HomeView(APIView):
# 规定传入的数据可以用JSON格式和Form格式
    parser_classes = [JSONParser, FormParser]
# 根据请求头选择解析器,寻找渲染器
    content_negotiation_class = DefaultContentNegotiation

    def post(self, request, *args, **kwargs):
        print(request.data, type(request.data)) #调用request.data开始使用解析器
        return Response('...')
点击查看代码
class APIView(View):

    def dispatch(self, request, *args, **kwargs):
        # url中的参数
        self.args = args
        self.kwargs = kwargs
        request = self.initialize_request(request, *args, **kwargs)

    def initial(self, request, *args, **kwargs):
        self.format_kwarg = self.get_format_suffix(**kwargs)

        neg = self.perform_content_negotiation(request)
        request.accepted_renderer, request.accepted_media_type = neg

        version, scheme = self.determine_version(request, *args, **kwargs)
        request.version, request.versioning_scheme = version, scheme

        self.perform_authentication(request)
        self.check_permissions(request)
        self.check_throttles(request)

    def initialize_request(self, request, *args, **kwargs):
        parser_context = self.get_parser_context(request)

        return Request(
            request,      # django的request
            parsers=self.get_parsers(),   # 解析器的类对象
            authenticators=self.get_authenticators(),  # 认证类对象
            # DefaultContentNegotiation
            negotiator=self.get_content_negotiator(), 
            parser_context=parser_context # 视图对象和url参数
        )

    def get_parsers(self):
        return [parser() for parser in self.parser_classes]

    def get_content_negotiator(self):
        if not getattr(self, '_negotiator', None):
            self._negotiator = self.content_negotiation_class()
        return self._negotiator

    def get_parser_context(self, http_request):
        return {
            'view': self,
            'args': getattr(self, 'args', ()),
            'kwargs': getattr(self, 'kwargs', {})
        }
点击查看代码
class Request:

    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        assert isinstance(request, HttpRequest), (
            'The `request` argument must be an instance of '
            '`django.http.HttpRequest`, not `{}.{}`.'
            .format(request.__class__.__module__, request.__class__.__name__)
        )

        self._request = request
        self.parsers = parsers or ()
        self.authenticators = authenticators or ()
        self.negotiator = negotiator or self._default_negotiator()
        self.parser_context = parser_context
        self._data = Empty
        self._files = Empty
        self._full_data = Empty
        self._content_type = Empty
        self._stream = Empty

        if self.parser_context is None:
            self.parser_context = {}
        self.parser_context['request'] = self  # drf的request、encoding
        self.parser_context['encoding'] = request.encoding or settings.DEFAULT_CHARSET

    @property
    def data(self):
        if not _hasattr(self, '_full_data'):
            self._load_data_and_files()
        return self._full_data

    def _load_data_and_files(self):
        if not _hasattr(self, '_data'):
            self._data, self._files = self._parse()
            if self._files:
                self._full_data = self._data.copy()
                self._full_data.update(self._files)
            else:
                self._full_data = self._data

            if is_form_media_type(self.content_type):
                self._request._post = self.POST
                self._request._files = self.FILES

    def _parse(self):
        # 获取请求头content_type
        media_type = self.content_type
        # 请求发过来的原始数据
        stream = self.stream
        # 获取解析器 [JSONParser, FormParser]
        parser = self.negotiator.select_parser(self, self.parsers)
        # 解析 json.loads('{'v1':123}')/json.load(文件对象)
        parsed = parser.parse(stream, media_type, self.parser_context)

        try:
            return (parsed.data, parsed.files)
        except AttributeError:
            empty_files = MultiValueDict()
            return (parsed, empty_files)

标签:解析器,self,parser,request,----,源码,context,._,data
From: https://www.cnblogs.com/only-you-zta/p/18066984

相关文章

  • 贴现率计算程序(java)
    折现率公式: CF0:成本CFi:第i期收入金额r:折现率java代码:importjava.util.ArrayList;importjava.util.Scanner;publicclassTest{publicstaticdoublecalculateNPV(doubleinitialInvestment,ArrayList<Double>cashFlows,doublediscountRate){......
  • 快速排序
    快排属于分治算法;思想:快排的思想是分治我们有一个待排序的数组,长度为n。选定一个基准,将数组分成左右两部分,左边的数小于基准,右边的数大于基准。然后我们分别看分割后左右两部分数组,如果元素个数大于1,就再次分割。直到最后,我们得到了n个数组,每个数组含有1个元素。这n个数组......
  • 排序链表(自底向上归并排序)
    题目:时间复杂度:O(nlogn),空间复杂度:O(1)structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}ListNode(int_val):val(_val),next(nullptr){}ListNode(int_val,ListNode*_next):val(_val),next(_next){}};class......
  • docker安装awvs
    1,下载awvsdockerpullsecfa/docker-awvs2,创建容器命令:dockerrun-it-d-p3443:3443secfa/docker-awvs如果报错!(提示crack失败)添加参数--cap-addLINUX_IMMUTABLE命令:dockerrun-itd-p3443:3443--cap-addLINUX_IMMUTABLE--nameawvssecfa/docker-awvs3,登录访......
  • webpack.config.js和vue.config.js的区别
    webpack.config.js 和 vue.config.js 是两个不同的配置文件,用于配置不同的工具和框架webpack.config.js:用途:这是webpack的配置文件,用于配置和定制webpack构建过程的各个方面,包括入口文件、输出目录、模块加载器、插件等。适用范围:适用于所有基于webpack的项目,不仅......
  • Django请求生命周期流程图
    Django请求生命周期流程图流程如下:浏览器发送请求(Http请求)web服务网关接口(Django默认的wsgiref模块不能承受高并发,最大只有1000左右)中间件>>缓存数据库(返回给中间件已经缓存过的数据)urls.py(路由层)views.py(视图层)templates(模板层:存放html静态......
  • Win10专业版系统永久升级密钥
    Windows10专业版是Windows10操作系统的商业版本。它包含Windows10家庭版的所有功能,并添加了一些适合小型企业和组织的功能。Windows10专业版的功能包括:设备加密:使用BitLocker加密设备上的数据,以防止未经授权的访问。远程桌面:从另一台设备远程连接到您的PC。组......
  • 256. 最大异或和
    可持久化字典树#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;constintN=6e5+5,M=N*24;intn,m,......
  • Asp .Net Web Forms 系列:配置图片防盗链的几种方法
    通过URLRewriteModule组件URLRewriteModule是一个用于在ASP.NETWebForms或其他基于IIS的Web应用程序中重写URL的强大工具。这个模块允许你将复杂的、不易于记忆或不利于搜索引擎优化的URL转换为更简洁、更友好的格式。通过URL重写,你可以提高网站的用户体验,......
  • Django
    Django配置与创建(1)创建Django项目django-adminstartproject文件名(2)启动Django文件pythonmanage.pyrunserver(3)创建apppythonmanage.pystartapp应用名#pythonmanage.pystartappapp01(4)注册app创建app后,如果想使用相关的功能,必须将创建的app注册到配置文件中......