Django nie przechowuje haseł jako zwykłego tekstu. Najpierw je haszy i przechowuje hasz. Tak więc, kiedy użytkownik się loguje, Django stosuje tę samą funkcję hash do danych wejściowych użytkownika, a następnie porównuje dwa skróty - od danych wejściowych użytkowników i od tego, co jest przechowywane w bazie danych.
Jednak, aby uczynić rzecz bardziej elastyczną, Django nie przechowuje haseł hasłowych, dobrze, ale dodatkowo, przechowuje również algorytm, za pomocą którego został wygenerowany skrót. Wyobraź sobie ten scenariusz - do generowania skrótów haseł używasz funkcji hashującej X
, ale wtedy zdajesz sobie sprawę, że ta funkcja nie jest już bezpieczna z jakiegokolwiek powodu i przełączysz się na funkcję mieszania Y
. Jest to jednak problem, ponieważ w danym momencie hash hasła użytkownika przechowywany przy użyciu funkcji X
nie będzie już mógł się zalogować. Dlatego Django przechowuje również metodę, według której został wygenerowany, oprócz samej wartości skrótu. Jest to miejsce, w którym przychodzi ustawienie PASSWORD_HASHERS
. Fakt, że Django przechowuje metodę, za pomocą której jest generowany skrót w db, podczas odczytywania wartości, tak naprawdę nie mówi Django, jak wykonać samą funkcję skrótu. Tak więc PASSWORD_HASHERS
jest czymś w rodzaju programu odwzorowującego między funkcją hashującą w języku Python (a właściwie klasą, ale tak czy inaczej ...) i wartością przechowywaną w bazie danych.
Wracam do pytania. Komunikat o błędzie oznacza, że Django nie jest świadomy funkcji haszowania password
, która została użyta do przechowywania skrótu hasła w bazie danych lub przynajmniej jej nie znajduje się w PASSWORD_HASHERS
.
Mogę wymyślić kilka powodów, dla których może się to stać.
Upewnij się, że wtedy zrobić syncdb
, używa tego samego pliku settings.py
jak wtedy, gdy uruchomiony jest serwer, aby uzyskać dostęp do admina. Może się zdarzyć, że używane są inne ustawienia.
Jednak deweloperzy zwykle nie modyfikują PASSWORD_HASHERS
w settings.py
i po prostu używają wartości domyślnej. W takim przypadku upewnij się, że używasz tego samego Pythona z tą samą zainstalowaną wersją Django, gdy wykonujesz syncdb
i kiedy uruchamiasz serwer. Jeśli robisz na przykład syncdb
w jednym virtualenv i uruchamiasz serwer w innym env, to wersje Django mogą być inne, dlatego mogą mieć inne ustawienia dla PASSWORD_HASHERS
i dlatego w przypadku uruchamiania syncdb
może to być funkcja mieszająca, która nie jest zdefiniowane po uruchomieniu serwera.
Możesz przeczytać więcej o tym, jak Django przechowywanie haseł w https://docs.djangoproject.com/en/1.4/topics/auth/#how-django-stores-passwords lub przeczytać całą stronę, aby uzyskać lepsze zrozumienie działania mechanizmu Django, który obejmuje uwierzytelnianie użytkownika. – miki725