【问题标题】:Flask-Restless dumps Decimal value from Flask-SqlalchemyFlask-Restless 从 Flask-Sqlalchemy 转储十进制值
【发布时间】:2013-02-06 10:09:14
【问题描述】:

我有这个使用 Flask-SQLAlchemy 的模型:

class Menu(Document, db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(80), unique=True, index=True)
    price = db.Column(db.Numeric)

我可以使用 Flask-Restless 为这个模型创建 api。问题是当我从 api url 进行 HTTP GET 时:

  File "/usr/lib/python2.6/json/encoder.py", line 344, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: Decimal('10000.0000000000') is not JSON serializable

问题很明显,JSON 编码器无法编码映射到价格的十进制值(数字列类型)。使用自定义 JSON 编码器启用 Flask-Restless 是否有任何解决方法?

【问题讨论】:

    标签: python json flask flask-sqlalchemy


    【解决方案1】:

    这是我所做的:

    import simplejson as json
    
    def postprocessor(data):
        json.dumps(data, use_decimal=True)
        return data
    
    manager.create_api(Menu, methods=['GET', 'POST', 'PATCH'], allow_patch_many=True, postprocessors={
    'PATCH_MANY': [postprocessor],
    'GET_MANY': [postprocessor],
    'POST': [postprocessor]
    })
    

    所以我们的想法是使用 Flask-Restless 的后处理器用 simplejson 而不是 json 对数据进行编码,因为 simplejson 通过指定 use_decimal=True 来支持 Decimal() 类型。

    编辑: 实际上,安装 simplejson 似乎就足够了。您的代码无需更改。

    【讨论】:

    • 是的,这正是我所做的。
    • 这里也一样 - 我在 requirements.txt 中安装了simplejson,没有做任何其他事情,一切都被清除了!感谢您提到这很容易。
    • 我正在使用flask_restx,有没有办法确保它使用simplejson?像这些用于 flask_restless 的预处理器一样,我们有用于 restx 的预处理器吗?
    【解决方案2】:

    如 mickael 的回答所示,安装 simpejson 就足够了。后处理器的正确语法如下:

    #first argument must be named as 'result', not 'data'
    def postprocessor(result):
        json.dumps(result, use_decimal=True)
        #return data - postprocessors/preprocessors should not return values!
    

    【讨论】:

      猜你喜欢
      • 2013-10-16
      • 2016-01-14
      • 1970-01-01
      • 2015-07-29
      • 2013-02-07
      • 2016-01-16
      • 2020-07-30
      • 2018-11-04
      • 2023-03-13
      相关资源
      最近更新 更多