Python + Flask REST API, 如何在驼峰式和蛇形式之间转换数据键?
Python + Flask REST API, how to convert data keys between camelcase and snakecase?
我正在学习 Python,并使用 Flask 微框架编写简单的 REST API。
我正在为 Object-serialization/deserialization 使用 SQLAlchemy for Object-relational-mapping and Marshmallow。
我正在为我的变量名使用 snakecase(根据 PEP8)。
当从前端 (Angular) 接收数据时,我需要将 JSON 对象键从驼峰式转换为蛇形,反之亦然,当返回响应数据时。
使用 Flask 执行此操作的最佳方法是什么?
我无法在互联网上找到好的答案。
您无需转换密钥,因为您不需要。数据不是代码,JSON 中的键不是变量。它们不受 PEP8 约束,您也无需转换它们。
如果您对 JSON 对象键有约定,请在前端和后端的任何地方坚持使用。然后使用Marshmallow 3.x data_key
argument for a field 在加载和转储时设置JSON文档中的键名
例如
class UserSchema(Schema):
first_name = fields.String(data_key="firstName")
last_name = fields.Email(data_key='lastName')
如果您想为所有字段自动执行此操作,您可以提供自己的 Schema.on_bind_field()
implementation 以根据字段名称生成 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 文档的示例部分有一个 similar recipe。
我正在学习 Python,并使用 Flask 微框架编写简单的 REST API。
我正在为 Object-serialization/deserialization 使用 SQLAlchemy for Object-relational-mapping and Marshmallow。
我正在为我的变量名使用 snakecase(根据 PEP8)。
当从前端 (Angular) 接收数据时,我需要将 JSON 对象键从驼峰式转换为蛇形,反之亦然,当返回响应数据时。
使用 Flask 执行此操作的最佳方法是什么?
我无法在互联网上找到好的答案。
您无需转换密钥,因为您不需要。数据不是代码,JSON 中的键不是变量。它们不受 PEP8 约束,您也无需转换它们。
如果您对 JSON 对象键有约定,请在前端和后端的任何地方坚持使用。然后使用Marshmallow 3.x data_key
argument for a field 在加载和转储时设置JSON文档中的键名
例如
class UserSchema(Schema):
first_name = fields.String(data_key="firstName")
last_name = fields.Email(data_key='lastName')
如果您想为所有字段自动执行此操作,您可以提供自己的 Schema.on_bind_field()
implementation 以根据字段名称生成 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 文档的示例部分有一个 similar recipe。