pythonjsondjangocelerycelery-task

kombu.exceptions.EncodeError: User is not JSON serializable


I have django 1.11.5 app with celery 4.1.0 and I recived all the time:

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

my 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

I call task in the view:

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

Solution

  • The error is because of Celery expecting a JSON data from your task function while you returned a User instance.

    How to solve this ?
    You are not using that return data anywhere, so you don't have to return it. That is you can remove return user from the task function.
    Or,
    return a Json data from the task function will solve this issue as well

    Solution 1

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


    Solution 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