0

パスワードをリセットするには、ユーザーはトークンを含むリンクに移動する必要があります。

example.com/password-change/?token=8125b6da86694a19b5d76f30a04c9db8

ビューで私は次のコードを持っています:

def _get_and_check_password_recovery_token(request, token_hex):
    try:
        token = tokens.get_token(token_hex)
    except Token.DoesNotExist:
        raise Http404
    if token.is_expired():
        token.delete()
        messages.warning(request,
        'Link you use for password recovery became obsolete. Please, request another one.')
        return redirect(reverse('password_recovery') + '?email=%s' % token.user.email)
    return token


def password_change(request):
    if request.method == 'POST':
        form = forms.PasswordChangeForm(request.POST)
        if form.is_valid():
            token_hex = form.cleaned_data.get('token')
            new_password = form.cleaned_data['new_password']
            if token_hex:
                token_or_response = _get_and_check_password_recovery_token(request, token_hex)
                if isinstance(token_or_response, Token):
                    user = token_or_response.user
                else:
                    return token_or_response
            else:
                ...
            ...
    else:
        token_hex = request.GET.get('token')
        if token_hex:
            token_or_response = _get_and_check_password_recovery_token(request, token_hex)
            if isinstance(token_or_response, Token):
                token_hex = token_or_response.hex
            else:
                return token_or_response
            form = forms.PasswordChangeForm(initial={'token': token_hex})
        else:
            form = forms.PasswordChangeForm() # TODO Authenticated user changes his password.
    return render_template(request, 'accounts/password_change.html', {'password_change_form': form})

ご覧のとおり、パスワード変更フォームが表示される前、およびユーザーが送信した後に、トークンを確認する必要があります。だから私はメソッドを_get_and_check_password_recovery_token(request, token_hex)2回呼び出します。応答オブジェクト(トークンが見つからないか正しくない)またはトークンを返します。そして、私はそれを快適に感じません-それは完全に異なるオブジェクトです。

このコードを書くためのより良い方法がわかりますか?論理的に異なるオブジェクトを返すことはPythonで問題ありませんか?

4

2 に答える 2

2

これは一般的な使用パターンであるため、djangoはこれを認証アプリケーションの一部として含め、1.4で拡張しました。のドキュメントを参照してくださいpassword_reset

すべての一般的なテンプレート(パスワードリセットメールなど)とトークンチェックも含まれています。

于 2012-07-17T09:20:09.307 に答える
0

トークンを返すことができない場合は例外を発生させます。このトークン検証をTokenクラスメソッドに移動します。

于 2012-07-17T09:06:32.387 に答える