【问题标题】:camelCase POST data in Django REST FrameworkDjango REST框架中的camelCase POST数据
【发布时间】:2015-11-14 00:29:25
【问题描述】:

我看到有一个名为 djangorestframework-camel-case 的项目,它允许在 Django REST 序列化程序中使用带有下划线大小写字段的 JavaScript-ish camelCase。所以,基本上,我可以发送:

{
    "camelCase": "foo"
}

并使用以下序列化器接收它:

class MySerializer(serializers.Serializer):
    session_id = serializers.CharField()

是否存在类似的 POST 数据?所以我可以通过 POST 发送 camelCase=foo 并将其接收到我的序列化程序中的 underscore_case 字段?

我尝试基于 FormParser 实现自己的解析器:

class CamelCaseFormParser(FormParser):
    media_type = 'application/x-www-form-urlencoded'

    def __init__(self):
        print("initialized")

    def parse(self, stream, media_type=None, parser_context=None):
        print("parse")
        ...

并且,在将其添加到 settings.py 中的 DEFAULT_PARSER_CLASSES 之后,虽然实际打印了 initialized,但没有打印 parse。因此,对于 POST 数据,似乎根本不使用 application/x-www-form-urlencoded 解析器。

因为序列化器是这样使用的:

Serializer(data=request.data)

我正在考虑继承序列化程序并在进一步处理之前修改data,甚至在创建序列化程序之前对其进行修改。但我要求的是一种更方便的方式,适用于所有序列化程序,而不需要对它们进行子类化。

【问题讨论】:

    标签: python django rest django-rest-framework camelcasing


    【解决方案1】:

    为什么不坚持使用解析器?

    from djangorestframework_camel_case.util import underscoreize
    from rest_framework import parsers
    from django.conf import settings
    from django.http import QueryDict
    
    
    class CamelCaseFormParser(parsers.FormParser):
        def parse(self, stream, media_type=None, parser_context=None):
            parser_context = parser_context or {}
            encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)
            data = QueryDict(stream.read(), encoding=encoding)
            return underscoreize(data)
    

    简单、有效且放置妥当...

    【讨论】:

    • 感谢这个 sn-p!还是值得的。
    猜你喜欢
    • 2017-04-07
    • 2018-06-25
    • 2017-04-16
    • 2018-08-18
    • 2018-04-04
    • 2017-02-04
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多