Celery EncodeError(TypeError('响应类型的对象不是 JSON 可序列化的'))

Posted

技术标签:

【中文标题】Celery EncodeError(TypeError(\'响应类型的对象不是 JSON 可序列化的\'))【英文标题】:Celery EncodeError(TypeError('Object of type Response is not JSON serializable'))Celery EncodeError(TypeError('响应类型的对象不是 JSON 可序列化的')) 【发布时间】:2021-12-24 02:38:43 【问题描述】:

我正在一起使用 Celery - Redis - Django 休息框架。 当我尝试将序列化程序传递给 Django rest 框架中的 celery 延迟时,就会发生错误。

这是视图集

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():

            image_uploaded= "static_path"
            
            json_data = base64.b64encode(np.array(image_uploaded)).decode('ascii')
            result = test_call.delay('image': json_data)
            result = test_call.delay(serializer)

            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(decoded_image):
    return decoded_image

我得到的错误是

EncodeError(TypeError('响应类型的对象不是 JSON 可序列化'))

更新: 即使这样做,我仍然会收到错误

result = test_call.delay("task": 1)

@shared_task(name="values")
def test_call(decoded_image):
    return "task": 2

【问题讨论】:

TestSerializer 是在哪里定义的? 【参考方案1】:

这不会回答你的问题,但我不能发表评论(低声誉)。

您似乎正在尝试对显然不是 JSON 可序列化的东西进行 JSON 序列化。根据名称,它是某种图像数据。你可以尝试一个不同的工作流,应该是 JSON 可序列化的,例如:

一个例子:

    首先将图像保存在以后可以访问的位置,然后在序列化程序中添加位置(S3 存储桶,然后是图像的链接) 在您的 celery 任务中,根据该位置获取图像数据

第二个例子:

    将图像数据转换为 JSON 可序列化的内容,例如 Base64 图像字符串

【讨论】:

正如简要提到的那样,这有帮助,我开始了另一个问题***.com/questions/69942867/…

以上是关于Celery EncodeError(TypeError('响应类型的对象不是 JSON 可序列化的'))的主要内容,如果未能解决你的问题,请参考以下文章

django 2.2, celery 4.3,出现 kombu.exceptions.EncodeError: cannot serialize '_io.BufferedReader'

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

如何在 Django 中使用 Celery 上传和处理大型 excel 文件?

EncodeError: 'latin-1' codec can't encode characters in position 69-70: ordinal not in r

celery:celery介绍架构基本使用,celery执行异步任务延迟任务定时任务,django中使用celery。

celery介绍