我使用带有Rest Framework的Django。我做了一个长轮询视图,以便将最新更新返回给其他客户端。
为了等待长时间的轮询,我使用了time.sleep(秒(功能。但这似乎只适用于做出改变的客户。其他客户似乎陷入了困境。
你能建议在PythonDjango中等待长时间轮询的正确方法吗?
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([])
在长轮询中,您有返回的API端点:
- 仍在等待结果的信息
- 如果结果可用,则返回结果
不应该在get()
方法中执行长时间运行的操作。您应该对它进行排队并在后台进行处理(例如使用芹菜(。
示例:
class PollingView(APIView):
def get(self, request):
# ...
if result.is_available():
return Response(result.json())
return Response({"status": "waiting"})