сессии django помнят меня

#python #django #checkbox

#питон #джанго #флажок

Вопрос:

Я новичок в django и не нашел вопроса, соответствующего моему начальному уровню. И я просто не могу понять, как работать с сеансами. Я хочу установить флажок при входе в систему, чтобы запомнить меня. После того, как я зарегистрировался в настройках SESSION_EXPIRE_AT_BROWSER_CLOSE = True, вам нужно ввести свое имя пользователя и пароль после закрытия браузера. Как мне изменить этот параметр, используя флажок «запомнить меня»? Спасибо

  views.py
def login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(username=username, password=password)
        if user is not None:
            auth.login(request, user)
            return redirect('/')
        else:
            messages.info(request, 'invalid credentials')
            return redirect('login')
    else:
        return render(request, 'prof/login.html')


login.html

<body>
  <div class="text-center mt-5">
    <form style="max-width: 480px; margin: auto" method="post">
      {% csrf_token %}
      <img
        src="https://logodix.com/logo/1713894.jpg"
        alt=""
        width="120"
        height="90"
        class="d-inline-block mt-4 mb-4"
      />
      <p class="hint-text mb-3">Please sign in</p>
      <label class="sr-only" for="username"></label>
      <input
        type="login"
        name="username"
        class="form-control"
        placeholder="username"
        required
        autofocus
      />
      <label for="password" class="sr-only"></label>
      <input
        type="password"
        name="password"
        class="form-control mt-2"
        placeholder="password"
      />
      <div class="checkbox">
        <label for="checkbox">
          <input type="checkbox" name="checkbox" value="remember-me" /> remember
          me
        </label>
      </div>
      <div class="d-grid gap-2 mt-4">
        <input type="Submit" class="btn btn-primary" value="sign in" />
      </div>
    </form>
    <div class="messages">
      {% for message in messages %}
      <h3>{{message}}</h3>
      {% endfor %}
    </div>
 

Ответ №1:

 def login(request):
if request.method == 'POST':
    username = request.POST['username']
    password = request.POST['password']
    user = auth.authenticate(username=username, password=password)
    try:
        remember = request.POST['remember_me']
        if remember:
            settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False
    except:
        is_private = False
        settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True

    if user is not None:
        auth.login(request, user)
        return redirect('/')
    else:
        messages.info(request, 'invalid credentials')
        return redirect('login')
else:
    return render(request, 'prof/login.html')
 

Ответ №2:

https://docs.djangoproject.com/en/3.1/topics/http/sessions/#browser-length-sessions-vs-persistent-sessions

вам нужно установить request.session.set_expiry(значение) при входе пользователя в систему и щелчке флажка.

значение в этой функции заполняется с использованием следующих типов данных и значений: https://docs.djangoproject.com/en/3.1/topics/http/sessions/#django.contrib.sessions.backends.base .База сеансов.set_expiry

для вас это будет означать следующее:

 def login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(username=username, password=password)
        if user is not None:
            auth.login(request, user)
            if request.cleaned_data['remember_me'] == True:
                request.session.set_expiry(value)
#                                          ^^^^^^
#                                          insert something here
            return redirect('/')
        else:
            messages.info(request, 'invalid credentials')
            return redirect('login')
    else:
        return render(request, 'prof/login.html')
 

Комментарии:

1. Большое спасибо за ваш ответ, но когда я не включаю <checkbox> при входе в систему, появляется ошибка:MultiValueDictKeyError . И я нашел это решение (второй ответ). Кажется, все работает, Что вы думаете о моем решении?

2. Выглядит хорошо. Хотя мне не очень нравится использование операторов try. Я внес небольшое изменение, которое может это исправить. Я бы также всегда предлагал использовать класс «forms». Это упрощает получение данных из формы.

3. Я вас понял, но < вставить что-то здесь> что мне нужно вставить здесь? что угодно?

4. Вы можете найти, что в документации у вас есть несколько доступных опций: docs.djangoproject.com/en/3.1/topics/http/sessions /…