Django はパスワードを平文で保存しません。最初にそれらをハッシュし、ハッシュを保存します。したがって、ユーザーがログインすると、Django は同じハッシュ関数をユーザーの入力に適用し、ユーザーの入力とデータベースに格納されているものからの 2 つのハッシュを比較します。
ただし、物事をより柔軟にするために、Django はパスワード ハッシュを保存しませんが、ハッシュが生成されたアルゴリズムも保存します。このシナリオを想像してみてください。ハッシュ関数を使用X
してパスワード ハッシュを生成しますが、何らかの理由でその関数がもはや安全ではないことに気付き、ハッシュ関数に切り替えますY
。ただし、その時点で、 function を使用してパスワードハッシュが保存されている人は誰でもX
ログインできなくなるため、これは問題です。そのため、Django は、ハッシュ値自体に加えて、has が生成されたメソッドも保存します。ここがPASSWORD_HASHERS
設定が入ります。 Django がハッシュを生成するメソッドを db に保存しているという事実は、値を読み取るときに、ハッシュ関数自体を実行する方法について Django に実際には通知しません。これPASSWORD_HASHERS
は、Python のハッシュ関数 (実際にはクラスですが...) と db に格納されている値の間のマッパーのようなものです。
それであなたの質問に戻ります。このエラー メッセージは、パスワードのハッシュをデータベースに格納するために使用されたハッシュ関数を Django が認識してpassword
いないか、少なくともPASSWORD_HASHERS
.
なぜそれが起こるのか、いくつかの理由を考えることができます。
サーバーを実行しているときsyncdb
と同じファイルを使用して管理者にアクセスすることを確認してください。settings.py
異なる設定が使用されている場合があります。
ただし、開発者は通常、 を変更せずPASSWORD_HASHERS
、settings.py
デフォルト値をそのまま使用します。syncdb
その場合、サーバーを実行するときと実行するときに、インストールされている同じバージョンの Django で同じ Python を使用していることを確認してください。たとえばsyncdb
、1 つの virtualenv で実行し、異なる環境でサーバーを実行する場合、Django のバージョンが異なる可能性があるため、設定が異なる可能性がありPASSWORD_HASHERS
、実行する場所が異なる可能性がsyncdb
あります。サーバーを実行します。