Python + Flask REST API,如何在驼峰命名法和下划线命名法之间转换数据键?

7

我正在学习Python,使用Flask微框架编写简单的REST API。

我正在使用SQLAlchemy进行对象关系映射,使用Marshmallow进行对象序列化/反序列化。

我在变量名中使用snakecase(根据PEP8规范)。

当从前端(Angular)接收数据时,我需要将JSON对象键从camelcase转换为snakecase,并在返回响应数据时执行相反操作。使用Flask,最佳途径是什么?

我在互联网上找不到一个好的答案。


你在使用Flask API或者转换实现方面遇到了问题吗?你能否给出一些正确转换的例子? - pastaleg
1个回答

7
您不需要转换键,因为数据不是代码,JSON中的键不是变量。它们不受PEP8的影响,也不需要进行转换。
如果您有JSON对象键的约定,请在前端和后端的任何地方坚持使用它。然后,使用Marshmallow 3.x data_key参数来设置加载和转储时JSON文档中的键名称。
例如:
class UserSchema(Schema):
    first_name = fields.String(data_key="firstName")
    last_name = fields.Email(data_key='lastName')

如果你想要为所有字段自动化这个过程,你可以提供自己的Schema.on_bind_field()实现来从字段名称生成一个data_key值:
import re
from functools import partial

from marshmallow import Schema

_snake_case = re.compile(r"(?<=\w)_(\w)")
_to_camel_case = partial(_snake_case.sub, lambda m: m[1].upper())

class CamelCasedSchema(Schema):
    """Gives fields a camelCased data key"""
    def on_bind_field(self, field_name, field_obj, _cc=_to_camel_case):
        field_obj.data_key = _cc(field_name.lower())

演示:

>>> from marshmallow import fields
>>> class UserSchema(CamelCasedSchema):
...     first_name = fields.String()
...     last_name = fields.String()
...
>>> schema = UserSchema()
>>> schema.load({"firstName": "Eric", "lastName": "Idle"})
{'first_name': 'Eric', 'last_name': 'Idle'}
>>> schema.dump({"first_name": "John", "last_name": "Cleese"})
{'firstName': 'John', 'lastName': 'Cleese'}

Marshmallow文档的示例部分有一个类似的食谱

如果您正在使用Marshmallow 2.x,则需要设置两个参数:load_fromdump_to


2
现在文档中有一个自动将键转换为驼峰命名的示例:https://marshmallow.readthedocs.io/en/latest/examples.html#inflection-camel-casing-keys - Steve L
不,对不起,我不同意。你要按照整体内部流量的惯例来工作。你不能仅仅因为其中一个系统坚持使用蛇形命名法来进行数据管理,就完全遵循Pythonic的命名规范。特别是在现今的微服务架构中,可能会有许多使用不同语言的服务器。而且别忘了,其中一些服务器可能是混合的(像Next/Nuxt等的SSR),并且提供多种输出的组合。那么谁应该优先考虑呢?如果我已经有一个现有的API框架,我会继续使用该框架,而不管Python的要求。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接