Django no almacena contraseñas como texto sin formato. Primero los hashes y ellos almacenan el hash. Entonces, cuando el usuario inicia sesión, Django aplica la misma función hash a la entrada de los usuarios y luego compara los dos hashes: desde la entrada de los usuarios y lo que está almacenado en el db.
Sin embargo, para hacer las cosas más flexibles, Django no almacena hash de contraseñas, pero sí, pero además, almacena el algoritmo por el que se generó el hash. Imagine este escenario: utiliza la función hash X
para generar hashes de contraseña, pero luego se da cuenta de que esa función ya no es segura por algún motivo y cambia a la función hash Y
. Sin embargo, eso es un problema porque, en el punto, cualquiera que tenga hash de contraseña almacenado mediante la función X
, ya no podrá iniciar sesión. Es por eso que Django también almacena el método por el cual se generó el has, además del valor hash en sí mismo. Aquí es donde entra la configuración PASSWORD_HASHERS
. El hecho de que Django almacene el método mediante el cual se genera el hash en el db, al leer el valor, realmente no le dice a Django cómo ejecutar la función hash. Entonces, PASSWORD_HASHERS
es como un mapeador entre la función de hash Python (en realidad una clase, pero de todos modos ...) y el valor almacenado en el db.
Volviendo a su pregunta. El mensaje de error significa que Django no tiene conocimiento de la función hash password
que se usó para almacenar el hash de la contraseña en su base de datos, o al menos no está en el PASSWORD_HASHERS
.
No puedo pensar en algunas de las razones por las que eso podría suceder.
Asegúrese de que luego lo hace syncdb
, utiliza el mismo archivo settings.py
como cuando se está ejecutando el servidor para acceder a la administración. Puede ser que se usen diferentes configuraciones.
Sin embargo, los desarrolladores generalmente no modifican PASSWORD_HASHERS
en el settings.py
y simplemente usan el valor predeterminado. En ese caso, asegúrese de estar utilizando el mismo Python con la misma versión instalada de Django cuando lo haga syncdb
y cuando ejecute el servidor. Si haces syncdb
en un virtualenv, por ejemplo, y ejecutas el servidor en diferentes env, entonces las versiones de Django pueden ser diferentes, por lo tanto pueden tener configuraciones diferentes para PASSWORD_HASHERS
y por lo tanto donde ejecutas syncdb
, podría estar usando una función hash que no es definido cuando ejecuta el servidor.
Puede leer más sobre cómo Django almacena las contraseñas en https://docs.djangoproject.com/en/1.4/topics/auth/#how-django-stores-passwords o leer toda la página para obtener una una mejor comprensión de cómo funciona Django auth, que incluye autenticación de usuario. – miki725