Сессии Django истекают, несмотря на вызов set_expiry (0) - PullRequest
2 голосов
/ 04 апреля 2019

Я пытаюсь внедрить флажок «запомнить меня» во встроенный в django LoginView, как предложено для этого вопроса , но даже если я вызываю set_expiry (0), сеансы по-прежнему истекают после SESSION_COOKIE_AGE, независимо от даты истечения срока действия cookie (которая правильно установлена ​​на 1969).

Я использую django 2.1.7 с python 3.7.2, и единственными настройками, относящимися к сеансу на моем settings.py, являются SESSION_COOKIE_AGE, который установлен на 5 секунд для отдыха.

Кажется, что Django использует базу данных по умолчанию.Я использую sqlite для разработки.

Это мой класс просмотра:

class UserLoginView(LoginView):
    form_class = registration.UserLoginForm

    def form_valid(self, form):
        remember = form.data.get('remember_me', False)
        if remember:
            self.request.session.set_expiry(0)
        return super(UserLoginView, self).form_valid(form)

И это original LoginView form_valid метод (переопределяемый выше)

class LoginView(SuccessURLAllowedHostsMixin, FormView):

...

    def form_valid(self, form):
        """Security check complete. Log the user in."""
        auth_login(self.request, form.get_user())
        return HttpResponseRedirect(self.get_success_url())

...

Как вы заметили, я использую пользовательский класс form_class.Очень простое переопределение формы по умолчанию:

class UserLoginForm(AuthenticationForm):
    remember_me = BooleanField(required=False)

Если я использую отладчик сразу после вызова set_expiry, я вижу, что срок действия сеанса по-прежнему равен 5 секундам по умолчанию:

> /project/app/views/accounts.py(64)form_valid()
-> return super(UserLoginView, self).form_valid(form)
(Pdb) self.request.session.get_expiry_age()
5

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

...

{{ request.session.get_expiry_age }}

...

Отображаемый результат также равен 5 (текущее значение по умолчанию).

Конечно, через 5 секунд, если вы обновите страницу, django вернет вас на экран входа в систему.

Что я здесь не так делаю?Было бы неплохо, если бы кто-то мог уточнить, что здесь означает "веб-браузер закрыт"?https://docs.djangoproject.com/en/2.2/topics/http/sessions/#django.contrib.sessions.backends.base.SessionBase.set_expiry

1 Ответ

2 голосов
/ 04 апреля 2019

TL;DR; Похоже, Django не предлагает поддержку бесконечного или действительно неопределенного времени истечения сеанса.Установите его на 30 дней или более, если вам нужно продлить срок его действия.

Из документации Django :

Если значение равно 0, файл cookie сеанса пользователя будетистекает, когда пользовательский веб-браузер закрыт.

Хотя здесь неясно, похоже, что установка времени истечения на 0 имеет аналогичное поведение при установке его на None: оно откатится кполитика истечения сеанса по умолчанию.Разница здесь в том, что при установке его на 0 мы также делаем вывод, что сеанс должен истечь сразу после того, как пользователь закроет браузер .В обоих случаях SESSION_COOKIE_AGE работает как значение максимального возраста сеанса.

Я полагаю, что вы можете установить большее число, чтобы обойти эту проблему, например, что-то, эквивалентное 100 годам или более.Мое личное предложение - указать время истечения 30 дней, когда пользователь проверяет поле «запомнить меня».Если вы укажете положительное целое число больше нуля, Django не вернется к значению SESSION_COOKIE_AGE.

Если вам интересно, почему вы получаете 5 секунд, даже после указания истечения 0 секунд,Вот исходный код, извлеченный из функции get_expiry_age:

if not expiry:   # Checks both None and 0 cases
    return settings.SESSION_COOKIE_AGE
if not isinstance(expiry, datetime):
    return expiry

Заключительные соображения:

  • В документации по Django есть место для улучшений
  • выглядит такобновление вкладки также может сделать недействительным сеанс
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...