Для API используется REST Framework.
Чтобы упростить код многие view сделаны используя REST Framework Generic Views.
Лонг поллинг реализован так: в момент обращения на /api/task/<id>/change_status
в отдельном классе в
переменную-флаг устанавливается True
, это показывает что есть изменения, о которых нужно сообщить клиенту. Тогда, при следующем обращении клиента на /api/listen_to_updates
вернется
json-объект с данными об изменении, и переменная-флаг снова установится в значение False
. Если клиент обратится
на /api/listen_to_updates
когда изменений нет, то откроется соединение, и сервер будет его поддерживать до того, как
произойдут изменения, о которых нужно сообщить клиету.
Для успешной работы с таким решением на клиенте должен быть запущен код вроде
let update = await fetch(window.location.protocol + '//' + window.location.host + '/api/listen_to_updates');
- Django 2.2.6
- REST Framework 3.10.3
python -m venv venv_folder
. venv_folder/bin/activate
pip install -r requirements.txt
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
Чтобы снизить нагрузку на сервер переменная-флаг проверяется раз в несколько секунд.
Количество секунд (частота обновления) устанавливается в settings.py
в переменной UPDATE_FREQUENCY
.
Все изменения, которые произойдут в этот и следующий промежутки времени будут сохранены и отправлены клиенту все сразу при следующем
обращении, даже если оно произойдет через несколько промежутков времени.