Я сталкиваюсь с очень специфической проблемой, которую я сузил до определенной причины, и я боюсь, что я могу просто неправильно понять или неправильно применить мою логику здесь.
Пользователи Django будут знать, что защита CSRF обрабатывается промежуточным программным обеспечением django и что за каждой формой, используемой в проекте, должен следовать тег {% csrf_token%}. Мой проект содержит приложение, которое обслуживает данные пользователей на основе их сеансов с аутентификацией OAuth2, для которых я затем сохраняю / сохраняю некоторые данные REST, относящиеся к конкретным сеансам.
Как вы, наверное, догадались, мне приходится довольно часто очищать кэш сеанса в случае новых пользователей или при изменении некоторых конкретных параметров в терминах сеанса текущего пользователя. Чтобы сделать это, я сохраняю некоторые значения из словаря request.session, а затем очищаю сеанс следующим образом:
remember_dictionary = {
'''some values that I wish to remember'''
}
request.session.clear()
for key, value in remember_dictionary.items():
if value:
request.session[key] = value
Если эта функция была вызвана в том случае, если у пользователя одновременно есть две формы на веб-сайте, старая форма выбросит токен Forbidden Error / csrf. Я понимаю, что request.session.clear (), вероятно, как-то связан с этим, но у меня сложилось впечатление, что токен csrf останется таким же для того же request.session? Насколько мне известно, request.session.flush () - это то, что будет удалять request.session и создавать новый? Кроме того, я попытался сохранить csrf_token в request.session, используя следующую строку в файле settings.py
CSRF_USE_SESSIONS = True
и затем включение текущего значения токена csrf в мой словарь запоминания, прежде чем я очищу сеанс следующим образом:
remember_dictionary = {
'''some values that I wish to remember''',
'_csrf_token': request.session.get('_csrf_token', False)
}
request.session.clear()
for key, value in remember_dictionary.items():
if value:
request.session[key] = value
Я проверил, что csrf_token запоминается во втором методе, но отправка более старой формы все равно приведет к отсутствию токена Forbidden Error / csrf.
Я что-то упускаю в своем рабочем процессе? Любая помощь приветствуется, спасибо.