django textfield_微擎应用模块源码

django textfield_微擎应用模块源码前言上一篇分析了请求模块的源码,如下:definitialize_request(self,request,*args,**kwargs):"""Retu

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

上一篇分析了请求模块的源码,如下:

def initialize_request(self, request, *args, **kwargs):
    """
    Returns the initial request object.
    """
    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
    )

上述源码中parsers=self.get_parsers()就是解析模块源码的入口
 

源码分析

我们点击get_parsers进入查看该方法

def get_parsers(self):
    """
    Instantiates and returns the list of parsers that this view can use.
    """
    return [parser() for parser in self.parser_classes]

该方法实例化并返回此视图可以使用的解析器列表,我们点击parser_classes,查看解析器列表

api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS)

parser_classes = api_settings.DEFAULT_PARSER_CLASSES

我们会发现解析器列表,是从api_settings中的DEFAULT_PARSER_CLASSES查找的,而api_settings又等于APISettings中的DEFAULTS,我们可以从settings中的DEFAUITS列表的DEFAULT_PARSER_CLASSES,如下:

DEFAULTS = {
    # Base API policies
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser'
    ],
}

我们可以看到,drf默认的解析器列表中有3个解析器,这3个解析器中都有media_type属性,代表支持解析的数据提交类型

  • JSONParser:media_type = 'application/json'
  • FormParser:media_type = 'application/x-www-form-urlencoded'
  • MultiPartParser: media_type = 'multipart/form-data'

如果我们想在以上3个解析器的基础上,再加上文件类型的解析器,那么需要全局配置。
 

全局配置

我们可以在settings.py文件中设置REST_FRAMEWORK配置,具体设置如下:

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

这样,我们以后所有继承于APIView的类视图都可以解析上面配置的4种数据类型,但是如果我们想某个视图只能解析json格式的数据,那么就需要局部配置
 

局部配置

默认全局配置是因为我们写的视图继承自APIViewAPIView中配置了类属性parser_classes,所以我们自己编写的视图函数中,也设置个类属性,并且导入JSONParser解析器

from rest_framework.parsers import JSONParser
class TestView(APIView):
    # 局部解析类配置
    parser_classes = [JSONParser]

    def post(self, request, *args, **kwargs):
        print(request.data)
        return Response("drf post ok")

接着我们使用application/x-www-form-urlencoded提交数据,会有如下报错

{
    "detail": "不支持请求中的媒体类型 “application/x-www-form-urlencoded”。"
}

然后我们使用multipart/form-data提交数据,也会报错

{
    "detail": "不支持请求中的媒体类型 “multipart/form-data; boundary=--------------------------022567055086460827891894”。"
}

最后我们使用application/json提交数据,响应成功

"drf post ok"

 

自定义解析器

如果我们想自定义一个解析器,也很简单,默认的3个解析器都继承自BaseParser,我们查看下源码

class BaseParser:
    """
    All parsers should extend `BaseParser`, specifying a `media_type`
    attribute, and overriding the `.parse()` method.
    """
    media_type = None

    def parse(self, stream, media_type=None, parser_context=None):
        """
        Given a stream to read from, return the parsed representation.
        Should return parsed data, or a `DataAndFiles` object consisting of the
        parsed data and files.
        """
        raise NotImplementedError(".parse() must be overridden.")

如果我们需要自定义解析器,那么就必须继承自BaseParser,并且设置属性media_type,还要重写parse方法,有需求的小伙伴可以自行尝试,这里就不演示了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164892.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 压缩文件解压密码破解之fcrackzip

    压缩文件解压密码破解之fcrackzip写在前面:网上对fcrackzip相关知识很多,我就不多哔哔了,我比较喜欢直接掏出重点少废话,写的花留呼哨一坨官方术语各种夸、没必要大家都挺忙的。工具简介:fcrackzip是一款专门破解zip类型压缩文件密码的工具,工具“短小精悍”。使用范围:Linux、Macosx关于安装:1、MacOSbrewinstallfcrackzip2、Ubuntuapt-getinstallfcrackzip3、CentOS这个比较特殊,yum找不到这个包,那就下.

    2022年5月11日
    55
  • 第三方接口开发流程「建议收藏」

    第三方接口开发流程「建议收藏」1.确定需要哪些接口重点是要确定每个接口的具体功能。确保这些接口是必须的,功能相互间没有交叉。2.接口设计及细节分析a)发送参数名、参数含义、参数数据类型、长度、精度b)接收参数名、参数含义、参数数据类型、长度、精度接口的使用的类型变量尽量通用,特别是对使用此接口的用户一无所知情况下,对方可能是JAVA,也可能是VB6,也可能是C#,不要使用某种编程语言的…

    2022年5月16日
    38
  • 高数两个重要极限公式_高数中两个重要公式

    高数两个重要极限公式_高数中两个重要公式(提示说明:其实下面的这些例题都可以直接使用“等价无穷小“”来做)凑成第一个特别重要极限的形式,之后再做处理。把用正弦的格式来代替正切把反三角函数转换成三角函数在做极限题,余弦一般看看是不是一个有界函数。凑成第二个重要极限形式,之后再做处理极限函数是分数形式,且分子与分母很相似,处理成(1+□)的形式,未知数趋向于无穷小或无穷大。待求极限函数有指数的时候,可以往…

    2022年5月3日
    67
  • minicom指令_如何优雅地使用minicom

    minicom指令_如何优雅地使用minicomminicom简介安装minicom是linux下一款常用的串口调试工具。ubuntu环境下,使用如下命令安装sudoapt-getinstallminicom配置使用前需要进行配置,执行sudominicom-s可打开minicom并进入配置模式,使用方向键,选择需要配置的项目,如Serialportsetup,回车进入配置,可以看到多个配置项,此时光标在最下方。需要修改某个配…

    2022年6月8日
    46
  • lea 指令_lea指令的功能

    lea 指令_lea指令的功能leaw#2个字节leal#4个字节leaq#8个字节leabase_address(offset_address,index,size),%rax根据括号里的源操作数来计算地址,然后把地址加载到目标寄存器中。计算地址base_address+offset_address+index*size,然后把最终地址载到寄存器rax中。lea不引用源操作数里的寄存器,只是单…

    2025年6月30日
    1
  • jlink烧录教程_自制flash烧录器

    jlink烧录教程_自制flash烧录器本文主要向大家介绍了Flash基础入门之J-Link固件烧录以及使用J-Flash向arm硬件板下载固件程序,通过具体的内容向大家展现,希望对大家学习Flash基础入门有所帮助。一、始于安装新版的MDK5.11a后,J-Link不能使用,提示安装新固件云云用新版本的STM32集成开发环境MDK5.11a(之前用的4.13a)链接J-Link下载程序,如果J-Link固件版本过低则点击J-Link设…

    2022年9月14日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号