web-dev-qa-db-ja.com

Django "Remember Me"組み込みのログインビューと認証フォーム

元のadmin login()とAuthenticationFormを再利用して、ログインページで[記憶する]オプションをオンにして、ユーザーのCookieの長さを長く設定するにはどうすればよいですか?現在、urls.pyを使用して組み込みのログインを使用しています

url(r'^login/$','Django.contrib.auth.views.login', {'template_name': 'authentication/login.html'}, name='login'),

このチェックボックスは、login.htmlで次のように実装されています。

<label><input name="remember_me" type="checkbox">Keep me logged in</label>

しかし、その情報をAuthenticationFormを介してDjango.contrib.auth.views.loginに渡す方法がわかりません

現在、ユーザーが「remember me」ボックスをチェックせずにログに記録する場合、cookieの有効期間はsettings.pyで定義されます

SESSION_COOKIE_AGE = 360

同様の質問がいくつか見つかりましたが、個別のアプリをインストールする必要はないと思います。以下のスニペット( http://djangosnippets.org/snippets/1881/ )は有望に思えたが、python and Django =数か月間のみ、私はそれを機能させることができませんでした:

def login(request, *args, **kwargs):
    if request.method == 'POST':
        if not request.POST.get('remember_me', None):
            request.session.set_expiry(0)
    return auth_views.login(request, *args, **kwargs)
37
Sawwy

DjangoセッションCookieの有効期間は seconds で定義されています。

SESSION_COOKIE_AGE = 360

セッションが6分後に期限切れになることを意味します。最近、「Remember Me」機能を実装し、次を設定しました。

SESSION_COOKIE_AGE = 60 * 60 * 24 * 30 # One month

スニペットで示したように、ログインビューをオーバーライドする必要があります。

しかし、ブラウザを閉じたときに(私がチェックされていないときに)ブラウザを再設定する必要がないという奇妙な問題が発生しているように聞こえますが、set_expiry(0)を使用した場合は発生しません。 set_expiry(0)を使用すると、Djangoは、固定長のCookieではなく「セッション」の長さのCookieを設定します。設計上、ブラウザーを閉じると期限切れになります。

ブラウザを閉じる際のCookieのクリアに影響する別の設定があります。 SESSION_EXPIRE_AT_BROWSER_CLOSE設定の値を変更するか、構成内の既存の値を確認してください。 https://docs.djangoproject.com/en/2.2/topics/http/sessions/#browser-length-sessions-vs-persistent-sessions

18
tarequeh

したがって、request.set_expiry(O)は匿名であるが認証されたユーザーのみにログインします。

if request.user.is_authenticated() and request.user.id is not None: return redirect('home')

0