Django: Как я могу реализовать ключ запомнить меня на моей странице входа - PullRequest
0 голосов
/ 22 ноября 2018

На самом деле, вместо того, чтобы просто писать код, я хочу знать все темы, которые я должен изучать, чтобы запомнить меня на своей странице входа.Это встроенная страница входа в django, и у меня есть немного знаний о сессиях и кеше, но этого недостаточно для того, чтобы сделать ключ запомнить меня и еще не кэшировать пользователя.Если вы можете предоставить мне ответ или источник, это будет полезно

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Просто добавьте в вашу форму новое поле, например:

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget= forms.PasswordInput)
    remember_me = forms.BoolenField()

И обновите представление

def login(request):
 if request.method == "POST":
      form = LoginForm(request.POST)
      if form.is_valid():
          username = form.cleaned_data['username']
          password = form.cleaned_data['password']
          remember_me = form.cleaned_data['remember_me']
          user = authenticated(username=username, password=password)
          if user:
               login(request, user)
               if not remember_me:
                    request.session.set_expiry(0)  # <-- Here if the remember me is False, that is why expiry is set to 0 seconds. So it will automatically close the session after the browser is closed.

               # else browser session will be as long as the session  cookie time "SESSION_COOKIE_AGE"
               return redirect('/some/success/url')
 else:
         form = LoginForm()

         render(request, 'name.html', {'form': form})

Обновите

Если вы используете AuthenticationForm, тогдаподкласс это так:

class LoginForm(AuthenticationForm):
    remember_me = forms.BooleanField()  # and add the remember_me field

А также подкласс ваш новый вид из LoginView .Также переопределите метод form_valid в представлении.

from django.contrib.auth import login as auth_login,


class UpdatedLoginView(LoginView):
     form_class = LoginForm

     def form_valid(self, form):

        remember_me = form.cleaned_data['remember_me']  # get remember me data from cleaned_data of form
        if not remember_me:
             self.request.session.set_expiry(0)  # if remember me is 
             self.request.session.modified = True
        return super(UpdatedLoginView, self).form_valid(form)
0 голосов
/ 22 ноября 2018

Вы можете ссылаться на этот проект запомнить меня:

https://github.com/jimfmunro/django-remember-me

, а также аналогичная проблема была решена в: Создать функцию «Запомнить меня» при входе в django по умолчаниюview

Вам необходимо установить период истечения сеанса:

request.session.set_expiry(1209600) # 2 weeks

Для сеансов Django установлено значение 2 недели (по умолчанию SESSION_COOKIE_AGE по умолчанию составляет 1209600 секунд), и срок его действия не истечет при закрытии браузера.(SESSION_EXPIRE_AT_BROWSER_CLOSE по умолчанию имеет значение False)

Но если необходимо установить флажок запомнить меня с функциями бэкэнда, вы можете сделать следующее в пользовательской форме входа в систему.

remember_me = forms.BooleanField(required=False, widget=forms.CheckboxInput())

if not self.cleaned_data.get('remember_me'):
self.request.session.set_expiry(0)
...