Ошибка кодировщика Celery с фреймворком django rest
Я использую Celery - Redis - Django rest framework вместе. Ошибка происходит, когда я пытаюсь передать сериализатор в задержку Celery в рамках Django rest framework.
Вот набор представлений
class TestSet(viewsets.ModelViewSet):
queryset = Test.objects.all()
serializer_class = ImageSerializer
def create(self, request, *args, **kwargs):
serializer = TestSerializer(data=request.data)
if serializer.is_valid():
print("I AM HERE") <-- This prints out
result = test_call.delay(serializer) <-- The error happens here
data = {"task": result.task_id}
return Response(data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@shared_task(name="values")
def test_call(serializer):
..some logic
return serializer
Ошибка, которую я получаю
kombu.exceptions.EncodeError: Object of type ImageSerializer is not JSON serializable
У меня есть следующее в settings.py
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
Это не ответит на ваш вопрос, но я не могу оставить комментарий (низкая репутация).
Похоже, что вы пытаетесь сериализовать в JSON то, что, очевидно, не является сериализуемым в JSON. Судя по названию, это какие-то данные изображения. Вы можете попробовать другой рабочий процесс, который должен быть JSON Serializable, например:
Один пример:
- сначала сохраните изображение в доступном месте и добавьте местоположение в сериализатор (S3 bucket, а затем ссылку на изображение)
- В вашей задаче celery, получите данные изображения на основе этого местоположения
Второй пример:
- преобразуйте данные изображения во что-то JSON сериализуемое, как строка изображения Base64
ну вы передаете экземпляр сериализатора в задачу, вы должны передать его данные:
...
if serializer.is_valid():
print("I AM HERE") <-- This prints out
result = test_call.delay(serializer.data) # change this line
data = {"task": result.task_id}
...