У меня есть некоторые объекты, которые я хочу отправить в задачи сельдерея в моем приложении. Очевидно, что эти объекты не могут быть сериализованы json, используя библиотеку json по умолчанию. Есть ли способ сделать сериал седиализует/десериализует эти объекты с помощью пользовательского JSON Encoder
/Decoder
?
Сельдерей: есть ли способ написать собственный JSON Encoder/Decoder?
Ответ 1
Немного позже, но вы сможете определить собственный кодировщик и декодер, зарегистрировав их в реестре сериализатора комбу, как в документах: http://docs.celeryproject.org/en/latest/userguide/calling.html#serializers.
Например, следующий пользовательский сериализатор/десериализатор datetime (подклассы python builtin json module) для Django:
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'