如何设置Eve资源和项目调用通过自定义反序列化功能?

0 投票
1 回答
760 浏览
提问于 2025-04-18 07:03

我无法让我的API返回JSON格式的日期字段,所以我不得不创建一个函数来处理这个问题。这个叫做dump_datetime的函数可以帮我完成这个任务。

现在我遇到的问题是,我不知道如何让我的资源调用在每次发起GET请求时都运行dump_datetime这个函数。

假设我们有一个用户资源Users,它有一个“出生日期”属性。我该如何让这个“出生日期”属性通过dump_datetime()函数呢?

Since in Eve you could already get the item call by  http://127.0.0.1:5000/users/id

我该如何设置GET调用,让它经过dump_datetime呢?

我的问题清楚吗?

下面是我使用我自己创建的deserialize函数的一个自定义函数示例。我只是想知道如何让它在Eve项目和资源调用中生效。

email = db.Column(db.String(120), unique=True)
def dump_datetime(value):
    """Deserialize datetime object into string form for JSON processing."""
    if value is None:
        return None
    return value.strftime("%Y-%m-%d")

@app.route('/test', methods=['GET'])
def test_mail():
  bdate = datetime.datetime.strptime( '19900914', "%Y%m%d").date()
  b = dump_datetime(bdate)
  return jsonify(results = b)

更新:我是否应该编辑/var/www/healthyoptions-middleware/eve/methods/get.py文件,并为需要序列化的属性运行serialize函数???

1 个回答

0

如果我理解你的问题没错,你只需要使用事件钩子。对于GET方法和你想要的资源,使用一个请求后的钩子就可以了;比如说 on_post_GET_<resource_name> = deserializing_function。另外,你也可以在数据库请求上设置钩子,比如 on_fetched_resource_

根据文档的说明:

当执行GET、POST、PATCH、PUT、DELETE方法时,会触发一个on_post_和on_post__事件。你可以用多个回调函数来订阅这些事件。回调函数会接收到被访问的资源、原始的flask.request对象和响应内容。

数据库事件钩子的工作方式和请求事件钩子类似。这些事件会在数据库操作前后触发。

http://python-eve.org/features.html#event-hooks

撰写回答