La registrazione degli utenti

L'ultimo pezzo per completare il puzzle è permettere agli utenti di registrarsi in autonomia. Non implenteremo un flusso di registrazione in autonomia ma ci affideremo ad una applicazione esterna, django-registration.

Per prima cosa installmia l'ultima versione di django-registration, al momento della scrittura siamo alla versione 3.1.2:

pip install django-registration

Quando aggiungiamo delle applicazioni esterne è buona norma congelare le dipendenze in modo da rendere il nostro progetto riproducibile. Nel mondo Python la gestione delle dipendenze è abbastanza in fermento e ci sono diversi progetti concorrenti, in questo corso useremo le funzionalità previste da pip.

Per congelare le dipendenze con pip possiamo usare il comando pip freeze:

pip freeze

Che stamperà un output simile a questo:

asgiref==3.3.4
confusable-homoglyphs==3.2.0
Django==3.2.2
django-registration==3.1.2
mysqlclient==2.0.3
pytz==2021.1
sqlparse==0.4.1

Per salvare una copia di questo file possiamo redirigere l'output su un file requirements.txt come da convenzione:

pip freeze > requirements.txt

Per installare in un altro ambiente virtuale le stesse dipendenze si usa pip install -r:

pip install -r requirements.txt

Salviamo il file requirements.txt in git:

git add requirements.txt
git commit -m "Aggiungiamo file requirements.txt"
git push origin main

Salvate le dipendenze ora passiamo ad integrare django-registration nella nostra applicazione. Vogliamo implementare il flusso a 2 passi documentato nella documentazione ufficiale. Questo flusso prevede che l'utente inserisca i campi richiesti dalla registrazione e confermi il corretto inserimento dell'indirizzo email tramite una email di conferma. Faremo i primi passi assieme e lascieremo la finalizzazione come esercizio.

Per prima cosa dobbiamo configurare una variabile nella nostra configurazione per decidere per quanto tempo lasciamo la possibilità agli utenti di finalizzare la registrazione, 7 giorni è un buon valore.

Apriamo catalogo/settings.py ed inseriamo:

ACCOUNT_ACTIVATION_DAYS = 7

Visto che la conferma dell'iscrizione viene inviata tramite email e che configurare un server di posta ci potrerebbe via del tempo utile configuriamo Django per usare un sistema di invio email che stampi il contenuto delle email in console. Dovremmo vedere le email inviate nella stessa shell in cui facciamo girare il server di sviluppo con runserver.

Sempre in catalogo/settings.py aggiungiamo:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

Quindi colleghiamo le viste di django-registration in catalogo/urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('corsi/', include('corsi.urls')),
    path('accounts/', include('django_registration.backends.activation.urls')),
    path('accounts/login/', auth_views.LoginView.as_view(), name='login'),
    path('accounts/logout/', auth_views.LogoutView.as_view(), name='logout'),
]

django-registration richiede diversi template da implementare, creiamo nella nostra directory dei templates una directory per contenerli:

mkdir templates/django_registration

Ora manca solo creare i template; segui la documentazione ufficiale per sapere quali creare, a cosa servono e quali variabili ricevono.

Dopo aver creato i templates puntando il browser all'indirizzo http://127.0.0.1:8000/accounts/register/ possiamo testare il processo di registrazione.

Una volta che tutto funziona aggiorniamo i nostri progressi su git:

git add catalogo templates
git commit -m "Aggiunta registrazione"
git push origin main

Esercizi

Se vuoi saperne di più sull'invio delle email in Django consulta la documentazione e anche quella specifica dei test.