0

私は Django を試していて、ログイン/登録アプリケーションを作成しようとしました。これが私が行き詰まった場所です-ユーザーを登録することはできますが、そのユーザーでログインできません。関連すると思われるコードは次のとおりです。

ビュー.py

def login(request, template='accounts/sign_in.html'):
    if request.user.is_authenticated():
        return redirect(reverse('games'))
    if request.method == 'POST':
        post = request.POST.copy()
        if 'password' in post:
            post['password'] = make_password(post['password'])
        form = AuthenticationForm(data=post)

        if form.is_valid():
            login(request, form.get_user())
            messages.success(
                request, "Successfully logged in.", extra_tags='success')
            return redirect(reverse('games'))
        else:
            messages.warning(
                request, "Wrong username or password." + request.POST['username'] + " " + request.POST['password'], extra_tags='error')
            return redirect(reverse('login'))
    return views.login(request, template)

def register(request, template='accounts/sign_up.html'):
    if request.user.is_authenticated():
        return redirect(reverse('home'))
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            new_user = User(
                username=form.cleaned_data['username'],
                password=make_password(form.cleaned_data['password1']),
                is_active=True,
            )
            new_user.save()

            messages.success(request, "Your account was successfully created.")
            return redirect(reverse('games'))
    else:
        form = RegisterForm()

    return render(request, template, {'register_form': form})

作成したユーザー (ユーザー名: qwe、パスワード: qweqweqwe) でログインしようとすると、再度ログインするように求められますが、まったく同じユーザー名とパスワードがメッセージに出力されます。

Wrong username or password.qwe qweqweqwe

ただし、対話型シェルを試すと、次のようになります。

>>> User.objects.all()
[<User: admin>, <User: asd>, <User: qwe>]
>>> User.objects.all()[2]
<User: qwe>
>>> User.objects.all()[2].password
u'pbkdf2_sha256$10000$HM2k6uDntJ68$DLqHKcGxtJG7pJC7tbZcm29vB88LEgaw2xroqZEkTFw='

そのようなユーザーがいて、それは有効なアカウントです。

4

2 に答える 2

1

これを呼び出す必要はないと確信していますmake_password

if 'password' in post:
    post['password'] = make_password(post['password'])
form = AuthenticationForm(data=post)

法線request.POSTを渡すだけdataで、フォーム自体が暗号化を行い、データベースに対してテストします。AuthenticationFormこれは、これを行うのcleanメソッドのフラグメントです。

def clean(self):
    username = self.cleaned_data.get('username')
    password = self.cleaned_data.get('password')

    if username and password:
        self.user_cache = authenticate(username=username,
                                       password=password)
    ...

ここで定義全体を見ることができます。

make_passwordの公式関数を使用していると思いますdjango.contrib,authが、ドキュメントをよく見てください。通常、ユーザー登録関数はこれを自動的に行うため、行う必要はありません。

いずれかの方法:

エラーフォームが呼び出し後に生成されていることを確認し、コードを次is_validのように変更します。login

if request.method == 'POST':
    form = AuthenticationForm(data=request.POST)

お役に立てれば!

于 2013-06-01T23:41:44.987 に答える
0

発行番号 1 - 間違っているlogin()

これはおそらく問題です:

login(request, form.get_user())

すでにlogin関数があり、たまたまビューになっています。ユーザー認証を確認したいと思います(form.is_valid()自動的には行われません)。

詳細はmoduleのドキュメントにありauthます:

ユーザーのログイン方法

現在のセッションにアタッチしたい認証されたユーザーがいる場合、これはlogin()関数で行われます。

ログインする()

ビューからユーザーをログインするには、 を使用しますlogin()。HttpRequest オブジェクトと User オブジェクトを取ります。login()Django のセッション フレームワークを使用して、ユーザーの ID をセッションに保存します。

匿名セッション中に設定されたデータは、ユーザーがログインした後もセッションに保持されることに注意してください。

authenticate()この例は、 と の両方を使用する方法を示していますlogin()

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            # Redirect to a success page.
        else:
            # Return a 'disabled account' error message
    else:
        # Return an 'invalid login' error message.

発行番号 2 - 間違ったパスワード

パウロが述べたように、AuthenticationFormすでにパスワードハッシュを処理しています. 例については、公式ドキュメントをお読みください。

Django 認証システムの使用: Web リクエストでの認証

于 2013-06-01T23:45:11.870 に答える