Получение информации за каждые x секунд
Я хотел бы узнать, есть ли способ проверять каждые x секунд значение в таблице базы данных в django, и если это нужное значение, то пользователь перенаправляется на другую страницу.
что я пробовал:
Я пытался использовать форму и она постит каждые 3 секунды и как только она делает пост она проверяет таблицу (модель), но страница даже не загружается, из-за сна (стоит отметить, что я пробовал SetTimeout и SetInterval)
def wait(request, slug):
form = MatchForm()
if request.method == 'POST':
roomName = Match.objects.get(roomname = slug)
if (int(roomName.num_players) > 1):
return redirect(f'../play/{slug}')
return render (request, 'chess/waiting_room.html', {'slug':slug, 'form':form})
waiting_room.html - javascript
function sleep(milliseconds) {
const date = Date.now();
let currentDate = null;
do {
currentDate = Date.now();
} while (currentDate - date < milliseconds);
}
subm_form()
function subm_form(){
var form = $("#form")
form.submit();
sleep(3000)
subm_form()
};
Я предпочел перезагружать страницу каждые 10 секунд, и на основе таблицы представление делает что-то.
В том типе подхода, который был нужен мне, я видел, что POST и/или форма работали не очень хорошо, как ожидалось, но если вы хотите использовать его, попробуйте поместить функцию внутри TimeOut, которая дает submit.
VIEWS.PY
def wait(request, slug):
roomName = Match.objects.get(roomname = slug)
if (int(roomName.num_players) == 0):
obj = Match.objects.get(roomname=slug)
obj.player1 = f'{request.user.username}'
obj.num_players = '1'
obj.save()
elif (int(roomName.num_players) == 1 and roomName.roomname.split('__vs__')[0] != request.user.username):
obj = Match.objects.get(roomname=slug)
obj.player2 = f'{request.user.username}'
obj.num_players = '2'
obj.save()
elif (int(roomName.num_players) == 2):
return redirect(f'../play/{slug}')
return render (request, 'chess/waiting_room.html', {'slug':slug})
def play(request, slug):
room = Match.objects.get(roomname=slug)
context = {
'iterator':'',
'slug':slug,
'actual_player' : 0,
'room':room,
}
return render (request, 'chess/play.html', context)
MYPAGE HTML
setTimeout(function(){window.location.href=window.location.href;}, 10000);