Python kombu.exceptions.EncodeError:用户不可JSON序列化

Python kombu.exceptions.EncodeError:用户不可JSON序列化,python,json,django,celery,celery-task,Python,Json,Django,Celery,Celery Task,我有django 1.11.5应用程序和芹菜4.1.0,我一直收到: kombu.exceptions.EncodeError: <User: testuser> is not JSON serializable tasks.py from __future__ import absolute_import, unicode_literals from celery import task from django.contrib.auth.models import User

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

kombu.exceptions.EncodeError: <User: testuser> is not JSON serializable
tasks.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
我在视图中调用task:

def form_valid(self, form):
    form.instance.user = self.request.user
    task_number_one.delay()
    return super().form_valid(form)

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

您有两个选择:

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


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

错误是因为芹菜在返回
用户
实例时,希望从任务函数中获得
JSON
数据。

如何解决这个问题?
您没有在任何地方使用该返回数据,因此不必返回它。也就是说,您可以从任务功能中删除返回用户。
或者,
从任务函数返回
Json
数据也将解决此问题

解决方案1

@task(serializer='json')
def task_number_one():
    user = User.objects.create(username="testuser", email="test@test.com", password="pass")
@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

解决方案2

@task(serializer='json')
def task_number_one():
    user = User.objects.create(username="testuser", email="test@test.com", password="pass")
@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

谢谢你的回答。在第1点中,您的意思是这样的(使用pk):
get\u object\u或_404(User,pk=self.kwargs['pk'])
?@MrName从Celery 4.0开始,他们使用
json
作为默认序列化程序,请参见,对不起,我说错了。正如@jerinterGeorge指出的,错误来自于返回值,而不是传递到任务中的参数。他的答案是完全正确的,除非您(出于某种原因)需要实际返回用户对象作为结果(情况可能并非如此)。在这种情况下,您需要设置
CELERY\u RESULT\u SERIALIZER='json'
这并不能解决我的问题。我有完全相同的问题。答案对于几乎相似的情况(当试图在任务中传递对象或类实例作为参数时)是正确的,但对于所问的问题则不正确。对于这个问题,@JPG是正确的。当从视图向任务传递对象时,也会发生此错误。请参见下面MrName的答案。