如何从Django信号返回数据?

2024-04-23 08:51:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Django rest开发API。在我的例子中,当用户发布数据时,我必须处理发布的数据(需要2-3分钟)。我编写了Django信号用于预处理数据。我的signal.py文件如下所示

@receiver(post_save, sender=ExposureIndex)
def calculate_exposure(instance, created, *args, **kwargs):
    ear_table = instance.ear_index.name
    haz_dir = instance.hazard_index.file.path

    # calling celery task
    task = exposure_calculation.delay(ear_table,haz_dir)

    return task.id

我的芹菜计算函数在这里

@shared_task(bind=True)
def exposure_calculation(self, ear_table, haz_dir):
    progress_recorder = ProgressRecorder(self)

    CalculateExposure(ear_table, haz_dir)

    return 'Done'

我的django rest视图函数如下所示

class ExposureIndexViewSet(viewsets.ModelViewSet):
    queryset = ExposureIndex.objects.all()
    serializer_class = ExposureIndexSerializer
    permission_classes = [permissions.IsAuthenticated]

我的问题是,当用户发布数据时,我想返回task.id,而不是返回实际响应(我试图从Django信号返回它,但在实际API中没有返回)。有谁能建议我,当用户发布exposureIndexData时,如何立即返回task.id


Tags: 数据djangoinstance用户restapiidtask
2条回答

您可以通过视图发送响应,而不用使用信号

def post(self,request):
  #create database manaully
  task=exposure_calculation.delay(ear_table,haz_dir)
  return Response({"message",task.id})

我认为您应该重写views.py中的create方法,而不是创建signal实例。在views.py文件中执行类似操作

class ExposureIndexViewSet(viewsets.ModelViewSet):
    queryset = ExposureIndex.objects.all()
    serializer_class = ExposureIndexSerializer
    permission_classes = [permissions.IsAuthenticated]

    def create(self, request, *args, **kwargs):
        response = super().create(request, *args, **kwargs)
        instance = response.data
        ear_table = instance['ear_table']
        haz_dir = instance['haz_dir']

        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)

        task = exposure_calculation.delay(ear_table,haz_dir)

        return Response({'task_id': task.id})

相关问题 更多 >