【问题标题】:Celery: is there a way to write custom JSON Encoder/Decoder?Celery:有没有办法编写自定义 JSON 编码器/解码器?
【发布时间】:2014-02-07 15:41:12
【问题描述】:

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

【问题讨论】:

    标签: python json celery


    【解决方案1】:

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

    例如,以下是 Django 的自定义日期时间序列化器/反序列化器(子类化python's builtin json module):


    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'
    

    【讨论】:

    • 我们应该把这段代码放在哪里?我们在哪里导入它?
    • @EduardLuca 你在使用 Django 吗?请看我的编辑
    • 酷。我不得不从settings.py 中拔出register 调用(由于某种原因,它抛出了一个完全不相关的错误),但这有效。谢谢!
    • 第 10 行和第 20 行有一个错字:'epoc' 应该是 'epoch'
    • 这曾经可以很好地工作,但由于 celery 4.2 我无法让它工作。启动 celery worker 时出错:不可恢复的错误:ContentDisallowed('拒绝反序列化 json (application/json) 类型的不受信任的内容',)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2020-06-27
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多