如何return 来自django 信号的数据?
How to return the data from django signal?
我正在使用 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
我的celery计算函数在这里,
@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]
我的问题是当用户发布数据时,我想 return task.id 而不是 return 实际响应(我试图 return 它来自 Django 信号,但它不是 return 在实际 API 中)。任何人都可以向我建议如何在用户发布 exposureIndexData
时立即 return task.id
吗?
您可以简单地通过您的视图发送响应,而不是使用信号
def post(self,request):
#create database manaully
task=exposure_calculation.delay(ear_table,haz_dir)
return Response({"message",task.id})
我认为您应该覆盖 views.py
中的 create
方法,而不是创建信号实例。在 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})
我正在使用 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
我的celery计算函数在这里,
@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]
我的问题是当用户发布数据时,我想 return task.id 而不是 return 实际响应(我试图 return 它来自 Django 信号,但它不是 return 在实际 API 中)。任何人都可以向我建议如何在用户发布 exposureIndexData
时立即 return task.id
吗?
您可以简单地通过您的视图发送响应,而不是使用信号
def post(self,request):
#create database manaully
task=exposure_calculation.delay(ear_table,haz_dir)
return Response({"message",task.id})
我认为您应该覆盖 views.py
中的 create
方法,而不是创建信号实例。在 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})