json序列化烧瓶上的日期宁静

时间:2017-01-18 15:29:16

标签: flask flask-restful

我有以下资源:

class Image(Resource):
    def get(self, db_name, col_name, image_id):
        col = mongo_client[db_name][col_name]
        image = col.find_one({'_id':ObjectId(image_id)})
        try:
            image['_id'] = str(image['_id'])
        except TypeError:
            return {'image': 'notFound'}
        return {'image':image}

链接到某个端点。

但是,image内部包含某些datetime个对象。我可以用`json.dumps(...,default = str)来包装它,但是我发现有一种方法可以在烧瓶上实现这一点。我不清楚到底需要做什么。

特别是,我读到了:

    It is possible to configure how the default Flask-RESTful JSON
    representation will format JSON by providing a RESTFUL_JSON
    attribute on the application configuration. 
    This setting is a dictionary with keys that 
     correspond to the keyword arguments of json.dumps().

class MyConfig(object):
    RESTFUL_JSON = {'separators': (', ', ': '),
                    'indent': 2,
                    'cls': MyCustomEncoder}

但我不清楚这究竟需要放在哪里。尝试了一些事情并没有用。

编辑:

我终于解决了这个问题:

之后
api = Api(app)

我补充说:

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            #return int(obj.strftime('%s'))
            return str(obj)
        elif isinstance(obj, datetime.date):
            #return int(obj.strftime('%s'))
            return str(obj)
        return json.JSONEncoder.default(self, obj)


def custom_json_output(data, code, headers=None):
    dumped = json.dumps(data, cls=CustomEncoder)
    resp = make_response(dumped, code)
    resp.headers.extend(headers or {})
    return resp

api = Api(app)
api.representations.update({
    'application/json': custom_json_output
})

2 个答案:

答案 0 :(得分:0)

创建了Flask应用,例如像这样:

root_app = Flask(__name__)

MyConfig放在某个模块中,例如config.py然后配置root_app,如:

root_app.config.from_object('config.MyConfig')

答案 1 :(得分:0)

只需清除此内容,您只需执行以下操作即可:

app = Flask(__name__)
api = Api(app)
app.config['RESTFUL_JSON'] = {'cls':MyCustomEncoder}

这适用于普通Flask和Flask-RESTful。

注意:

1)显然,文档的以下部分不清楚:

  

可以配置默认的Flask-RESTful JSON   表示形式将通过提供RESTFUL_JSON属性来格式化JSON   在应用程序配置上。此设置是带有   与json.dumps()的关键字参数相对应的键。

 
class MyConfig(object):
    RESTFUL_JSON = {'separators': (', ', ': '),
                    'indent': 2,
                    'cls': MyCustomEncoder}

2)除了'cls'参数之外,您实际上还可以覆盖json.dumps函数的任何关键字参数。