zoukankan      html  css  js  c++  java
  • DRF——解析器

    一 、解析器的作用:

    对应 请求头的content_type选择对应的解析器对应的请求体内容进行处理

    有application/json、x-www-form-urlencoded、form-data等格式

    二、全局使用解析器

    1、settiing文件中

    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES':[
            'rest_framework.parsers.JSONParser'
            'rest_framework.parsers.FormParser'
            'rest_framework.parsers.MultiPartParser'
        ]
    
    }

    2、路由层

    urlpatterns = [
        url(r'test/', TestView.as_view()),
    ]

    3、视图层中

    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    class TestView(APIView):
        def post(self, request, *args, **kwargs):
            print(request.content_type)
    
            # 获取请求的值,并使用对应的JSONParser进行处理
            print(request.data)
            # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
            print(request.POST)
            print(request.FILES)
            return Response('POST请求,响应内容')
    
        def put(self, request, *args, **kwargs):
            return Response('PUT请求,响应内容')

    三、局部使用:

    1、仅处理请求头content-type为application/json的请求体

    from django.conf.urls import url, include
    from web.views.s5_parser import TestView
    
    urlpatterns = [
        url(r'test/', TestView.as_view(), name='test'),
    ]
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework.request import Request
    from rest_framework.parsers import JSONParser
    
    
    class TestView(APIView):
        parser_classes = [JSONParser, ]
    
        def post(self, request, *args, **kwargs):
            print(request.content_type)
    
            # 获取请求的值,并使用对应的JSONParser进行处理
            print(request.data)
    
            # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
            print(request.POST)
            print(request.FILES)
    
            return Response('POST请求,响应内容')
    
        def put(self, request, *args, **kwargs):
            return Response('PUT请求,响应内容')

    2、仅上传文件

    from django.conf.urls import url, include
    from web.views import TestView
    
    urlpatterns = [
        url(r'test/(?P<filename>[^/]+)', TestView.as_view(), name='test'),
    ]
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework.request import Request
    from rest_framework.parsers import FileUploadParser
    
    
    class TestView(APIView):
        parser_classes = [FileUploadParser, ]
    
        def post(self, request, filename, *args, **kwargs):
            print(filename)
            print(request.content_type)
    
            # 获取请求的值,并使用对应的JSONParser进行处理
            print(request.data)
            # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值
            print(request.POST)
            print(request.FILES)
            return Response('POST请求,响应内容')
    
        def put(self, request, *args, **kwargs):
            return Response('PUT请求,响应内容')

    四、源码分析

    1、通过reques.data 进行解析,由此入手

    2、通过查看self._load_data_and_files()方法---->self._data, self._files = self._parse()

    3、查看_parse

    4、查看self.negotiator.select_parser(self, self.parsers)

    5、最终调用parser的解析方法来解析parsed = parser.parse(stream, media_type, self.parser_context)

  • 相关阅读:
    Sonar安装与使用说明
    oracle物化视图使用+hibernate
    CAS实现SSO单点登录原理(转)
    冒泡事件通用解法
    百度网盘搜索
    (转)mvn clean install 与 mvn install 的区别(为啥用clean)
    初识Channel
    Java 重入锁 ReentrantLock
    多线程之Future模式
    一天一个类--NIO 之Buffer
  • 原文地址:https://www.cnblogs.com/king-home/p/11143245.html
Copyright © 2011-2022 走看看