Вы не можете использовать такую глобальную переменную в Django. Приложение Django обычно выполняется в нескольких серверных процессах, которые не разделяют память. Вызов game
установил бы глобальную переменную current_question_key
только в одном из процессов. Все остальные процессы будут иметь старые значения. Поскольку запрос может быть обработан любым процессом, вы получите более или менее случайные результаты.
Сервер разработки Django использует многопоточность вместо многопроцессорной обработки. Потоки, в отличие от процессов, совместно используют одну и ту же память, поэтому все запросы видят одно и то же значение для current_question_key
.
Вы должны хранить current_question_key
для каждого пользователя таким образом, чтобы он был доступен для всех процессов. Наиболее очевидным решением было бы сохранить эту информацию в сеансе пользователя :
request.session['current_question_key'] = ...
Кроме того, вы можете сохранить его в базе данных, например, с ForeignKey
в пользовательской пользовательской модели или если вы хотите отслеживать какие-либо игры в отдельной таблице, например:
from django.contrib.auth import get_user_model
from django.db import models
class Game(model.Model)
user = models.ForeignKey(
get_user_model(),
on_delete=models.CASCADE
)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True, db_index=True)
Затем вы можете получить текущую игру для пользователя, отсортировав по дате создания:
Game.objects.filter(user=request.user).order_by('-created_at').first()
В зависимости от того, как часто меняется текущий вопрос, вы также можете рассмотреть возможность использования значения ключа, такого как Redis, хотя это немного усложняет.