代码之家  ›  专栏  ›  技术社区  ›  user9357277

科姆布。例外情况。EncodeError:用户不可JSON序列化

  •  17
  • user9357277  · 技术社区  · 6 年前

    我有django 1.11.5应用程序和芹菜4.1.0,我一直收到:

    kombu.exceptions.EncodeError: <User: testuser> is not JSON serializable
    

    我的设置。py:

    CELERY_BROKER_URL = 'amqp://localhost'
    CELERY_RESULT_BACKEND = 'amqp://localhost'
    CELERY_ACCEPT_CONTENT = ['application/json']
    CELERY_RESULT_SERIALIZER = 'json'
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_TIMEZONE = 'Asia/Makassar'
    CELERY_BEAT_SCHEDULE = {}
    

    任务。py公司

    from __future__ import absolute_import, unicode_literals
    from celery import task
    from django.contrib.auth.models import User
    
    
    @task(serializer='json')
    def task_number_one():
        user = User.objects.create(username="testuser", email="test@test.com", password="pass")
        return user
    

    我在视图中调用任务:

    def form_valid(self, form):
        form.instance.user = self.request.user
        task_number_one.delay()
        return super().form_valid(form)
    
    2 回复  |  直到 6 年前
        1
  •  27
  •   MrName    6 年前

    这是因为您正在使用JSON序列化程序进行任务序列化(如设置所示 CELERY_TASK_SERIALIZER = 'json' ),但您试图返回一个模型实例(无法序列化为JSON)。

    您有两种选择:

    1) 不要传递实例,传递实例的主键,然后在任务中查找对象。

    2) 使用 pickle 改为任务序列化程序。这将允许您将对象作为参数传递给任务并返回它们,但它是自己的 security concerns

        2
  •  16
  •   JPG    6 年前

    错误是因为芹菜需要 JSON 返回 User 例子

    如何解决这个问题?
    您没有在任何地方使用该返回数据,因此不必返回它。那就是你可以删除 return user 从任务功能。

    返回a Json 任务功能中的数据也将解决此问题

    解决方案1

    @task(serializer='json')
    def task_number_one():
        user = User.objects.create(username="testuser", email="test@test.com", password="pass")
    


    解决方案2

    @task(serializer='json')
    
    def task_number_one():
        user = User.objects.create(username="testuser", email="test@test.com", password="pass")
        # return some json data instead of `USER` instance
        return {"status": True}  # Change is here