Celery:有没有办法编写自定义 JSON 编码器/解码器?

2024-05-01

我有一些对象想要发送到我的应用程序上的 celery 任务。这些对象显然不能使用默认的 json 库进行 json 序列化。有没有办法让 celery 使用自定义 JSON 序列化/反序列化这些对象Encoder/Decoder?


这里有点晚了,但是您应该能够通过在 kombu 序列化程序注册表中注册自定义编码器和解码器来定义它们,如文档中所示:http://docs.celeryproject.org/en/latest/userguide/calling.html#serializers http://docs.celeryproject.org/en/latest/userguide/calling.html#serializers.

例如,以下是自定义日期时间序列化器/反序列化器(子类化python的内置json模块 http://docs.python.org/2/library/json.html#module-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)


设置.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'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Celery:有没有办法编写自定义 JSON 编码器/解码器? 的相关文章

随机推荐