首页 > 解决方案 > python django长轮询等待

问题描述

我将 Django 与 Rest Framework 一起使用。我做了一个长轮询视图,以将最新更新返回给其他客户端。

为了等待长轮询,我使用了 time.sleep(seconds) 函数。但这似乎只适用于做出改变的客户。其他客户似乎卡在某个地方。

您能否建议在 Python Django 中等待长轮询的正确方法?

class ChangedItemsPollingView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def get(self, request):
        request_received_time = datetime.datetime.now()
        ten_seconds_later = request_received_time + datetime.timedelta(seconds=10)
        
        while(datetime.datetime.now() < ten_seconds_later):
            changed_items = Asset.objects.filter(updated_at__gt=request_received_time)
            if(changed_items):
                tmpJson = djangoSerializers.serialize('json', changed_items)
                tmpObj = json.loads(tmpJson)
                return Response(tmpObj)
            time.sleep(3)
        
        return Response([])

标签: pythondjangodjango-rest-framework

解决方案


在长轮询中,您有返回的 API 端点:

  • 它仍在等待结果的信息
  • 如果结果可用,则返回结果

get()您不应该在该方法中执行长时间运行的操作。您应该将其排队并在后台处理(例如使用芹菜)。

例子:

class PollingView(APIView):

    def get(self, request):
        # ...
        if result.is_available():
            return Response(result.json())

        return Response({"status": "waiting"})


推荐阅读