Django non memorizza le password come testo normale. Prima li salda e loro memorizza l'hash. Quindi, quando l'utente effettua il login, Django applica la stessa funzione di hash agli input degli utenti e poi confronta i due hash - dagli input degli utenti e ciò che è memorizzato nel db.
Tuttavia, per rendere le cose più flessibili, Django non memorizza gli hash delle password, ma lo fa, ma in aggiunta memorizza anche l'algoritmo con cui è stato generato l'hash. Immagina questo scenario: usi la funzione hash X
per generare gli hash delle password, ma poi ti rendi conto che quella funzione non è più sicura per qualsiasi motivo e passi alla funzione di hashing Y
. Questo comunque è un problema perché al punto, l'hash della password di chiunque è memorizzato usando la funzione X
, non sarebbero più in grado di effettuare il login. Ecco perché Django memorizza anche il metodo con cui è stato generato l'has, oltre al valore hash stesso. È qui che entra in gioco l'impostazione PASSWORD_HASHERS
. Il fatto che Django memorizzi il metodo con cui viene generato l'hash nel db, quando legge il valore, in realtà non dice a Django come eseguire la funzione di hash stessa. Quindi PASSWORD_HASHERS
è un po 'come un mappatore tra la funzione di hashing di Python (in realtà una classe ma comunque ...) e il valore memorizzato nel db.
Quindi torna alla tua domanda. Il messaggio di errore indica che Django non è a conoscenza della funzione di hashing password
che è stata utilizzata per memorizzare l'hash della password nel database, o almeno non è nello PASSWORD_HASHERS
.
Posso pensare a un paio di motivi per cui ciò potrebbe accadere.
Assicurarsi che poi si fa syncdb
, utilizza lo stesso settings.py
file come quando si esegue il server per accedere al admin. Potrebbe essere il caso che vengano utilizzate impostazioni diverse.
Tuttavia, gli sviluppatori di solito non modificano PASSWORD_HASHERS
nello settings.py
e utilizzano semplicemente il valore predefinito. In tal caso, assicurarsi di utilizzare lo stesso Python con la stessa versione installata di Django quando si esegue syncdb
e quando si esegue il server. Se si esegue syncdb
in un virtualenv, ad esempio, ed è in esecuzione server in env differenti, le versioni di Django potrebbero essere diverse, quindi potrebbero avere impostazioni diverse per PASSWORD_HASHERS
e quindi dove si esegue syncdb
, potrebbe essere utilizzata una funzione di hashing che non è definito quando si esegue il server.
Si può leggere di più su come Django memorizza le password in https://docs.djangoproject.com/en/1.4/topics/auth/#how-django-stores-passwords o leggere l'intera pagina per ottenere un una migliore comprensione di come funziona l'autenticazione Django, che include l'autenticazione dell'utente. – miki725