ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

aiohttpのweb.json_responseにDecimalとかdatetimeとか変換できるようにしたい

スポンサードリンク

Pythonjson.dumps は変換できない型があります。

qiita.com

↑の記事のように進めたらできるのですが、フレームワークに組まれている変換関数はどうやったら設定できるの?というのが今回の話。

早速コードを確認してみると、なるほど、関数自体をわたしているのね。どうやって引数を渡しましょうか。

https://github.com/aio-libs/aiohttp/blob/65de218c6297284663eeae5c07e9146ef1e4485e/aiohttp/web_response.py#L735

悩んでいたけど、defaultで設定した関数をそのまま渡しちゃえばいいじゃんということになり、下記のように書いた。

from decimal import Decimal
import json

from aiohttp import web



def convert_default_proc(obj):
    if isinstance(obj, Decimal):
        return float(obj)

    raise TypeError(repr(obj))


def json_convert_default_proc(data):
    return json.dumps(data, default=convert_default_proc)


def json_response(response_data):
    return web.json_response(
        response_data, text=None, reason=None, headers=None,
        content_type='application/json',
        dumps=json_convert_default_proc)