python - 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([])
解决方案
在长轮询中,您有返回的 API 端点:
- 它仍在等待结果的信息
- 如果结果可用,则返回结果
get()
您不应该在该方法中执行长时间运行的操作。您应该将其排队并在后台处理(例如使用芹菜)。
例子:
class PollingView(APIView):
def get(self, request):
# ...
if result.is_available():
return Response(result.json())
return Response({"status": "waiting"})
推荐阅读
- flutter - 高效调用 Futurebuilder
- regex - .htacess mod_rewrite 超薄路由
- css - 使用没有计算的剩余父高度
- javascript - Javascript:按单列重复数据删除二维数组
- prettier - 停止格式化最小文件?
- angular - Angular/Express GET 调用有时有效,有时失败。出现错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头
- reactjs - 将传递函数作为没有 jsx 的道具反应
- javascript - 为什么 Javascript 粘性标头不起作用?
- python - azure - Python - 分析法语文本。法语参数?
- html - 如果您添加以及获取它的脚本标签,您是否会获取两次数据?