我正在学习Python,使用Flask微框架编写简单的REST API。
我正在使用SQLAlchemy进行对象关系映射,使用Marshmallow进行对象序列化/反序列化。
我在变量名中使用snakecase(根据PEP8规范)。
当从前端(Angular)接收数据时,我需要将JSON对象键从camelcase转换为snakecase,并在返回响应数据时执行相反操作。使用Flask,最佳途径是什么?
我在互联网上找不到一个好的答案。
我正在学习Python,使用Flask微框架编写简单的REST API。
我正在使用SQLAlchemy进行对象关系映射,使用Marshmallow进行对象序列化/反序列化。
我在变量名中使用snakecase(根据PEP8规范)。
当从前端(Angular)接收数据时,我需要将JSON对象键从camelcase转换为snakecase,并在返回响应数据时执行相反操作。使用Flask,最佳途径是什么?
我在互联网上找不到一个好的答案。
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文档的示例部分有一个类似的食谱。