2010-08-23 24 views
18

Ok, questo è abbastanza ovvio per tutti quelli che usano Django e vengono spesso richiesti dai neofiti, ma vorrei chiarire e discutere se ci sono altri modi per farlo. L'approccio più diffuso e conveniente è ora di archiviare e-mail nel campo nome utente come Django 1.2 permette di "@", "_" e "-" caratteri, ma in questo modo ha seguenti problemi:Email come username in Django

  1. Il peggiore: campo nome utente è limitato dalla proprietà max_length=30, che è ridicolmente piccola per le e-mail. Anche se si esegue l'override della convalida del modulo, DB avrà varchar(30) anziché EmailFieldvarchar(75) a meno che non si modifichi manualmente la tabella.
  2. È necessario memorizzare i dati di posta elettronica sia nel nome utente che nel campo di posta elettronica per rendere operativo User.email_user(). Penso che ci siano altri posti quando viene usato lo User.email.
  3. Errore di leggibilità del codice. Certo, altri Djangonauti sanno di questo trabocchetto, ma il campo di trattamento chiamato 'username' (specialmente quando c'è ancora un campo di posta elettronica) come email ovviamente rende il tuo codice meno comprensibile.

L'altro approccio potrebbe essere l'autenticazione utilizzando email campo passando al tuo backend di autenticazione in questo modo, ma ha ancora problemi:

authenticate(self, email=None, password=None) 
  1. User.email non ha unique=True proprietà, il che significa che il tuo DB non avrà indice, rendendo le tue ricerche via email lente come l'inferno.
  2. Devi occuparti del campo username, che ha unique=True, rimuovendolo completamente dalla tabella o modificandolo per consentire NULL e rimuovere l'indice.

Riprendendo, in entrambe le direzioni sono il male e richiedono il codice DB-specifiche da eseguire dopo syncdb, il che è inaccettabile se avete bisogno di un'applicazione DB-indipendente.

+0

Domanda interessante, mi piacerebbe sapere come usare le e-mail come nomi utente anche in Django ;-) – gruszczy

risposta

5

Ho impacchettato django-email-as-username che dovrebbe fare praticamente tutto ciò che serve se si desidera rimuovere i nomi utente e utilizzare solo le e-mail.

La breve panoramica è:

  1. fornisce un'email auth funzioni di back-end e di supporto per la creazione di utenti.
  2. Patch l'amministratore Django per gestire l'autenticazione utente basata su e-mail.
  3. Al di là del comando creauperuser per creare utenti con solo e-mail.
  4. Tratta l'autenticazione della posta elettronica come maiuscole e minuscole.

Sotto i nomi utente cofano viene eseguito l'hashing versioni dei messaggi di posta elettronica, che finisce nel senso che non siamo limitati a nome utente 30 limite char del Django (solo il regolare e-mail 75 limite char.)

Modifica : A partire da Django 1.5, dovresti cercare di utilizzare un modello utente personalizzato invece del pacchetto 'django-email-as-username'.

0

Bene, non ho dovuto usare le e-mail come username in Django ma immagino che potreste creare un modello UserProfile e aggregare campi ad esso, come un altro campo di posta elettronica e renderlo unico. Quindi potresti fare user.get_profile(). Email per la tua autenticazione.

Immagino che l'altro modo per andare sia ereditare User e ridefinire i campi, ma penso che questo non sia ancora raccomandato dagli sviluppatori di Django.

Infine, è possibile definire il proprio modello utente personalizzato e ritornare su django.contrib.auth.models.User per un po 'di logica.

Codice di alter table utente all'interno di Django:

from django.db import connection 
cursor = connection.cursor() 
cursor.execute("ALTER TABLE auth_user MODIFY COLUMN username varchar(75) NOT NULL") 
+0

La cosa cattiva con l'ereditarietà multi-tavolo o la modifica della copia locale di app di autenticazione è che non c'è modo di definire quale modello dovrebbe altre applicazioni contrib come l'uso di admin, messaggi o commenti. –

+0

Capisco. Immagino che aggiungere un nuovo campo a UserProfile sia il modo migliore per andare se non si desidera seguire l'opzione 1. Non sono sicuro, se esiste un altro approccio al momento. – maraujop

+0

Un'altra cosa che potresti fare se vuoi essere un po 'più indipendente dal DB è aggiungere questo codice (risposta modificata), con una variabile in settings.py per indicare se deve essere eseguita o se è già stata modificata. – maraujop

5

David Cramer si avvicinò con una soluzione a questo problema che amo. Lo sto attualmente utilizzando su un sito di produzione in cui l'utente deve essere in grado di accedere utilizzando la sua email O il loro nome utente. Potete trovare qui:

Logging In With Email Addresses in Django

Se il nome di login fornito sul modulo è una e-mail (contiene il simbolo '@'), tenterà di autenticare con quello, e ricadrà sul nome utente se non è un'e-mail. (Naturalmente, devi solo assicurarti che il tuo modulo di registrazione acquisisca un'email per questo lavoro.)

Problemi correlati