Python + Flask REST API,如何在驼峰和蛇壳之间转换数据密钥



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

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

我正在使用蛇壳作为我的变量名称(根据 PEP8(。

当从前端(Angular(接收数据时,我需要将JSON对象键从驼峰转换为蛇形,反之亦然,当返回响应数据时。

使用烧瓶执行此操作的最佳方法是什么?

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

您不会转换密钥,因为您不需要这样做。数据不是代码,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'}

棉花糖文档的示例部分也有类似的配方。

如果您使用的是棉花糖 2.x,则需要设置两个参数:load_fromdump_to

最新更新