【发布时间】:2021-10-13 23:41:57
【问题描述】:
- Django 3.2
- DRF
- 使用 ./mange runserver 运行
- 部署规划时使用'nginx,uwsgi'
这是我的后端代码
class ChatHandler(APIView):
queryset = Chat.objects.all()
serialzier_class = MessageSerializer
def get_queryset(self):
return self.queryset.filter(name=self.kwargs['room']).get()
def get(self, request, room):
optionail_last_message_time = request.data.get('at')
new_messages = self.get_queryset().messages.filter(is_viewed=False)
while not new_messages.exists():
print(timezone.localtime().time(), 'no new messages')
sleep(3)
print(dir(self))
print(dir(self.request))
print('oh here it is')
last_time = new_messages.last().created_at.timestamp()
serializered_new_messages = self.serialzier_class(instance=new_messages, many=True).data
new_messages.update(is_viewed=True)
return Response(
{
'messages': serializered_new_messages,
'last_time': last_time,
'initial': False
}, status=200
)
这是前端代码
function textRequest(last_time) {
$.ajax({
method:'GET',
url:long_url,
data: {'at': last_time},
timeout:2000,
success : (data, status, xqhr) => {
console.log(last_time)
let messages = data['messages']
console.log(messages)
if (messages) {
for (let message of messages) {
console.log(message)
inject_message(message)
}
}
setTimeout(()=>{
textRequest(data['last_time'])
}, 5000)
},
error: (error, status_text, xqhr)=> {
if ((error.readyState == 0) && (status_text =='timeout')) {
console.log(status_text)
textRequest()
console.log('sent')
}
},
})
}
window.addEventListener('load', ()=>{
textRequest()
})
问题:
- 当我刷新页面时,它会向
后端,并将继续发送请求, 后端服务器接收数百个请求
问题:如何限制接收请求的数量?
- 当服务器找到数据,并将其处理回前端时, 响应没有到达“前端”,因为它是请求 已经死了'达到了超时限制'
问题:我应该怎么做才能避免这种情况? 问题:有没有办法从后端知道请求是否已经超时?
请求:请允许我在 Django 中实现长轮询,我在这个问题上卡了几天?
提前致谢
【问题讨论】:
标签: python django polling long-polling