如何在flask API中返回一个通用的JSON对象?

时间:2014-10-22 01:55:51

标签: python json flask decorator

我正在构建一个返回JSON字符串的API。但是,我的目标是在结果周围有一个公共包装器,其中包含有关返回结果的各种元数据属性以及返回结果。

  • 结果总数(我不允许用户一次查询超过1000个,因此他们需要知道是否有更多结果,以便他们可以请求下一组结果)
  • 节流时间(告诉用户在下一次请求之前退出一段时间 - 如果API忙,则很有用)
  • 错误代码/消息
  • 请求数据用户

我的JSON对象看起来像这样:

{
    'total_results': 1001,
    'throttle': 0,
    'error_cd': 0,
    'message': 'Successful',
    'results': [
        # Data that is returned; Each end point can return a different "type"
        ]
}

目标是让我的终点只返回results中出现的数据(甚至不是JSON格式)。我的问题是如何提供这个包装?

我最初的想法是某种运行jsonify的装饰器,但装饰器可以在函数后运行吗? IE浏览器。我可以在我的路线中运行代码然后运行装饰器代码吗?

1 个答案:

答案 0 :(得分:3)

如何编写包装函数呢?我可能会做类似的事情:

 @app.route('/api/blah/')
 def my_route():
     results = calculate_my_results()
     return jsonify(format_api_result(results))

 def format_api_result(data):
     # add in your extra metadata here, return a dictionary

在我看来,功能是最直接,最灵活的方式来做你想做的事。这是一个额外的代码,但所以这是一个装饰。虽然你当然可以在装饰器中做到这一点,但我认为除了复杂性之外,它并没有增加太多。

如果你想去装饰路线,请查看:

http://www.jeffknupp.com/blog/2013/11/29/improve-your-python-decorators-explained/

有关装饰器如何工作以及如何控制包装函数的确切控制的详细解释。

如果我误解了你想要做的事,请告诉我。