kombu.exceptions.EncodeError: User is not JSON serializable
kombu.exceptions.EncodeError: User is not JSON serializable
我有 django 1.11.5 应用程序和 celery 4.1.0,我一直收到:
kombu.exceptions.EncodeError: <User: testuser> is not JSON serializable
我的settings.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 = {}
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
我在视图中调用任务:
def form_valid(self, form):
form.instance.user = self.request.user
task_number_one.delay()
return super().form_valid(form)
这是因为您正在使用 JSON 序列化程序进行任务序列化(如设置 CELERY_TASK_SERIALIZER = 'json'
所示),但您正在尝试 return 模型实例(不能序列化为 JSON).
您有两个选择:
1)不传递实例,传递实例的主键,然后在你的任务中查找对象。
2) 请改用 pickle
任务序列化程序。这将允许您将对象作为参数传递给您的任务和 return 它们,但它带有它自己的 security concerns.
错误是因为当您 returned 一个 User
实例时,Celery 期望来自您的任务函数的 JSON
数据。
如何解决?
您没有在任何地方使用该 return 数据,因此您不必 return 它。那就是你可以从任务函数中删除return user
。
或者,
return来自任务函数的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
我有 django 1.11.5 应用程序和 celery 4.1.0,我一直收到:
kombu.exceptions.EncodeError: <User: testuser> is not JSON serializable
我的settings.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 = {}
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
我在视图中调用任务:
def form_valid(self, form):
form.instance.user = self.request.user
task_number_one.delay()
return super().form_valid(form)
这是因为您正在使用 JSON 序列化程序进行任务序列化(如设置 CELERY_TASK_SERIALIZER = 'json'
所示),但您正在尝试 return 模型实例(不能序列化为 JSON).
您有两个选择:
1)不传递实例,传递实例的主键,然后在你的任务中查找对象。
2) 请改用 pickle
任务序列化程序。这将允许您将对象作为参数传递给您的任务和 return 它们,但它带有它自己的 security concerns.
错误是因为当您 returned 一个 User
实例时,Celery 期望来自您的任务函数的 JSON
数据。
如何解决?
您没有在任何地方使用该 return 数据,因此您不必 return 它。那就是你可以从任务函数中删除return user
。
或者,
return来自任务函数的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