Python + Flask REST API,如何在camelcase和snakecase之间转换数据键?

2024-04-15

我正在学习 Python,并使用编码简单的 REST APIFlask http://flask.pocoo.org/微框架。

我在用SQL炼金术 https://www.sqlalchemy.org/用于对象关系映射和棉花糖 https://marshmallow.readthedocs.io/en/3.0/用于对象序列化/反序列化。

我使用蛇形命名我的变量名(根据PEP8 https://www.python.org/dev/peps/pep-0008/).

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

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

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


您无需转换密钥,因为您不需要这样做。数据不是代码,JSON 中的键也不是变量。它们不受 PEP8 的约束,您也无需转换它们。

如果您对 JSON 对象键有约定,请在前端和后端的任何地方都遵循它。然后使用棉花糖 3.xdata_key https://marshmallow.readthedocs.io/en/3.0/quickstart.html#specifying-serialization-deserialization-keys加载和转储时用于设置 JSON 文档中键名称的字段参数。

E.g.

class UserSchema(Schema):
    first_name = fields.String(data_key="firstName")
    last_name = fields.Email(data_key='lastName')

如果您想为所有字段自动执行此操作,您可以提供自己的Schema.on_bind_field()执行 https://marshmallow.readthedocs.io/en/latest/api_reference.html#marshmallow.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())

Demo:

>>> 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 文档的示例部分有一个类似的食谱 https://marshmallow.readthedocs.io/en/latest/examples.html#inflection-camel-casing-keys.

如果您使用的是 Marshmallow 2.x,则需要设置两个参数:load_from https://marshmallow.readthedocs.io/en/stable/quickstart.html#specifying-deserialization-keys and dump_to https://marshmallow.readthedocs.io/en/stable/quickstart.html#specifying-serialization-keys.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python + Flask REST API,如何在camelcase和snakecase之间转换数据键? 的相关文章

随机推荐

  • 是否可以预加载和缓存视频文件而不将它们添加到 DOM?

    我正在开发一款游戏 根据得到的结果触发 30 个小视频文件中的一个 由于视频需要在用户交互后立即播放 因此理想情况下我希望预加载视频并准备好播放 我添加了 PreloadJS 对我需要的所有资源进行了排队 查看检查器中的 网络 选项卡 我可
  • ed25519.公开结果不同

    使用包https github com golang crypto tree master ed25519 https github com golang crypto tree master ed25519我正在尝试获取给定私钥的公钥 这
  • 将变量传递到 xp_cmdshell

    我在 SQL Server 中有一个存储过程 用于检查今天的备份文件 文件名中包含日期的文件 检查完毕后 将继续进行robocopy这些文件到另一个文件夹 挑战 在此文件夹中 可能存在昨天或其他日期的文件 但只需要今天的bak文件来传输 d
  • 错误域=NSOSStatusErrorDomain 代码=-12780 \"(null)\"

    当我尝试使用 AVAssetExport 导出资产时 仅在通过 Whatsapp 接收的视频上可能会出现以下错误 我找不到可行的解决方案 我还尝试实现代码来修复视频持续时间 但我没有修复它 错误是 错误域 NSOSStatusErrorDo
  • Webpack 4.编译scss分离css文件

    我试图将 scss 编译成一个单独的 css 文件 但没有成功 现在 css 与所有 js 代码一起进入到bundle js 中 我怎样才能将我的CSS分离到它自己的文件中 这是我的配置的样子 var path require path m
  • 使用 jQuery 检查链接是否仍然有效

    我创建了一个快速功能 使用 AJAX 检查页面上的每个链接 看看它们是否仍然有效 这似乎有效 但它为每个类添加了成功和错误类 如何让错误回调函数仅在 AJAX 响应为 404 时抛出 li each function this childr
  • 如何垂直对齐 IE 输入框上的文本

    I have this http jsfiddle net dVDT8 code
  • 获取虚拟目录中文件的本地路径

    我有一个 ASP NET Core 3 0 MVC 应用程序 其中包含图像 例如 http foo bar images image jpg 现在 文件夹images is a 虚拟目录映射到网络驱动器 例如 192 168 1 1 ima
  • 如何增加 Qt 中线程的堆栈大小 - QThread::setStackSize() 似乎不起作用?

    从问题来看 运行批量插入或替换 500 行时 SQLite 堆栈溢出 为什么 https stackoverflow com questions 22576958 sqlite stack overflow when running a b
  • Gnuplot multiplot 中的双柱图

    我尝试创建多图 2x2 和单图的组合 我不知道 我做错了什么 但我不知道该怎么做 我的尝试 plot sin x title this should be a single plot set multiplot layout 2 2 tit
  • 是否可以过滤开放扩展?

    我正在考虑选择开放扩展还是架构扩展 架构扩展 我知道我可以过滤 但由于我没有注册任何有效的顶级域名 所以我最终得到了一个丑陋的架构名称 这不是一个阻碍 只是一个小小的刺激 我正在向组添加自定义元数据 并希望将查询限制为具有特定元数据值的所有
  • 扩展现有的 jQuery 函数

    我正在尝试编写一个插件来扩展 jQuery 中的现有功能 例如 function fn css function stuff I will be extending that doesn t affect change the way cs
  • Rails:ActiveRecord:RecordNotUnique 与first_or_create

    我的模型表中有这个索引 UNIQUE KEY index panel user offer visits on offer id and panel user id offer id panel user id 这段代码 def get o
  • 重复 Microsoft Word VBA 直到找不到搜索结果

    我创建了一个 MS Word 宏 用于搜索某些文本 由标记代码表示 剪切文本并将其插入到新的脚注中 然后从脚注中删除标记代码 现在我希望宏重复 直到它在文本中找不到更多标记代码 这是下面的宏 Sub SearchFN find a foot
  • 如何在VS2013中为新项目设置默认.NET框架?

    我正在开发一个针对 net 4 0 的项目 它不会很快更改为 4 5 当我创建新项目时 它默认为 net 4 5 无论如何 我可以在 Visual Studio 级别全局将其默认为 4 0 或者 更好 在解决方案级别默认它为 4 0 吗 最
  • 将按钮数组添加到 Android 应用程序中的 GridView

    我的应用程序将有 5 15 个按钮 具体取决于后端可用的内容 如何定义正确的 GridView 布局文件以包含一组按钮 每个按钮都有不同的文本和其他属性 每个按钮本质上都会将一个商品添加到购物车 因此除了添加到购物车的商品之外 onClic
  • 如何使用 SBT 使用 build.scala 中的 -D 变量?

    我有一个 build scala 文件 它的依赖项如下所示 com example core 2 0 classifier full unstable 这会拉入一个带有完全不稳定分类器的 JAR 我需要做的是从 Jenkins 构建服务器
  • 如何建立rdfa lite节点之间的关系

    尝试在语义上标记有关特定地址的报告页面 该页面提供有关地址能源消耗的报告 并提供与能源消耗相关的服务优惠 我想在语义上表示该地点的地址 与该地址相关的能源报告以及该地址可用的优惠 现在 我的标记有一个用于地点的 RDFa lite 节点和另
  • Nerdtree - 保存打开目录的状态

    对我来说 典型的工作流程是打开 Vim 准确地说是 MacVim 执行以下操作 NERDTree
  • Python + Flask REST API,如何在camelcase和snakecase之间转换数据键?

    我正在学习 Python 并使用编码简单的 REST APIFlask http flask pocoo org 微框架 我在用SQL炼金术 https www sqlalchemy org 用于对象关系映射和棉花糖 https marsh