web-dev-qa-db-ja.com

セロリ:カスタムJSONエンコーダー/デコーダーを作成する方法はありますか?

アプリケーションのセロリタスクに送信したいオブジェクトがいくつかあります。これらのオブジェクトは、デフォルトのjsonライブラリを使用してjsonシリアル化できないことは明らかです。セロリにカスタムJSONEncoder/Decoderを使用してこれらのオブジェクトをシリアル化/逆シリアル化する方法はありますか?

26

ここでは少し遅れていますが、ドキュメントのように、昆布シリアライザーレジストリに登録することで、カスタムエンコーダーとデコーダーを定義できるはずです。 http://docs.celeryproject.org/en/latest/userguide /calling.html#serializers

たとえば、以下はDjangoのカスタム日時シリアライザー/デシリアライザー(サブクラス化 pythonの組み込みjsonモジュール )です。


myjson.py(settings.pyファイルの同じフォルダーに配置します)

import json
from datetime import datetime
from time import mktime

class MyEncoder(json.JSONEncoder):   
    def default(self, obj):
        if isinstance(obj, datetime):
            return {
                '__type__': '__datetime__', 
                'Epoch': int(mktime(obj.timetuple()))
            }
        else:
            return json.JSONEncoder.default(self, obj)

def my_decoder(obj):
    if '__type__' in obj:
        if obj['__type__'] == '__datetime__':
            return datetime.fromtimestamp(obj['Epoch'])
    return obj

# Encoder function      
def my_dumps(obj):
    return json.dumps(obj, cls=MyEncoder)

# Decoder function
def my_loads(obj):
    return json.loads(obj, object_hook=my_decoder)


settings.py

# Register your new serializer methods into kombu
from kombu.serialization import register
from .myjson import my_dumps, my_loads

register('myjson', my_dumps, my_loads, 
    content_type='application/x-myjson',
    content_encoding='utf-8') 

# Tell celery to use your new serializer:
CELERY_ACCEPT_CONTENT = ['myjson']
CELERY_TASK_SERIALIZER = 'myjson'
CELERY_RESULT_SERIALIZER = 'myjson'
41
f.cipriani