Как установить таймер внутри запроса get в APIView?
Я пытаюсь создать таймер внутри метода get в DRF View. Я создал метод таймера внутри класса GameViewController и пытаюсь добиться того, чтобы каждую минуту (5 раз подряд) пользователю показывался объект ресурса через запрос get и создавался объект game round. На данный момент мой View работает, однако таймер, похоже, ничего не делает.
Я знаю, что это не совсем то, как все делается в django, но именно так мне нужно сделать для моего игрового API в целях игровой логики.
Как я могу заставить таймер работать? Нужно ли использовать что-то вроде request.time или что-то подобное?
Заранее спасибо.
views.py
class GameViewController:
def timer(self):
"""Start a new timer as soon as a gameround has been started/created"""
start_time = datetime.now()
elapsed_time = None
if start_time is not None:
elapsed_time = time.perf_counter()
"""Stop the timer, and return the elapsed time"""
if start_time is None:
elapsed_time = time.perf_counter() - start_time
return elapsed_time
...
class GameView(APIView):
def get(self, request, *args, **kwargs):
...
round_number = gametype.rounds
time = controller.timer()
while round_number != 0:
if time >= 1:
random_resource = Resource.objects.all().order_by('?').first()
resource_serializer = ResourceSerializer(random_resource)
gameround = Gameround.objects.create(
id=controller.generate_random_id(Gameround),
user_id=current_user_id,
gamesession=gamesession,
created=datetime.now(),
score=current_score
)
gameround_serializer = GameroundSerializer(gameround)
round_number -= 1
Если вы хотите быстро перейти к этому - используйте huey https://github.com/coleifer/huey
Вам нужно будет установить Redis в качестве бэкенда вашей очереди. Это несложно.
Huey может запускать ваш код с помощью cron, задержек или чего-то еще более сложного:
from huey import RedisHuey, crontab
huey = RedisHuey('my-app', host='redis.myapp.com')
@huey.task()
def add_numbers(a, b):
return a + b
@huey.task(retries=2, retry_delay=60)
def flaky_task(url):
# This task might fail, in which case it will be retried up to 2 times
# with a delay of 60s between retries.
return this_might_fail(url)
@huey.periodic_task(crontab(minute='0', hour='3'))
def nightly_backup():
sync_all_data()
Hyue имеет расширения Django https://huey.readthedocs.io/en/latest/contrib.html#django
Что касается меня, это был самый быстрый способ достижения тех же задач, и это работало в производстве в течение ~1 года без моей поддержки.