Django: очистка request.session между формами вызывает ошибку токена csrf? - PullRequest
0 голосов
/ 15 мая 2018

Я сталкиваюсь с очень специфической проблемой, которую я сузил до определенной причины, и я боюсь, что я могу просто неправильно понять или неправильно применить мою логику здесь.

Пользователи 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.

Я что-то упускаю в своем рабочем процессе? Любая помощь приветствуется, спасибо.

...