【问题标题】:django sessions remember medjango 会议记得我
【发布时间】:2021-01-16 18:53:57
【问题描述】:

我是 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>

【问题讨论】:

    标签: python django checkbox


    【解决方案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(value)。

      此函数中的值使用以下数据类型和值填写:https://docs.djangoproject.com/en/3.1/topics/http/sessions/#django.contrib.sessions.backends.base.SessionBase.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')
      

      【讨论】:

      • 非常感谢您的回答,但是当我登录时没有打开 时,出现错误:MultiValueDictKeyError。我找到了这个解决方案(第二个答案)。一切似乎都奏效了你对我的决定有何看法?
      • 看起来不错。虽然我不太喜欢使用 try 语句。我做了一个小改动,可能会解决它。我也总是建议使用“表单”类。这使得从表单中获取数据变得更加容易。
      • 我理解你的意思,但是 我需要在此处插入什么?什么?
      • 您可以在文档中找到多种可用选项:docs.djangoproject.com/en/3.1/topics/http/sessions/…
      猜你喜欢
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多