Autenticação de usuários com django-allauth
Autenticação de usuários é um requisito essencial da maioria dos aplicativos web. Django, o framework Python mais completo para desenvolvimento web, vem com seu sistema próprio de autenticação. Embora bom, ele falha ao não apresentar itens essenciais para a criação de aplicativos modernos. Para esses casos, a biblioteca django-allauth é a solução ideal. Neste post, mostraremos como ela pode ser facilmente utilizada para expandir as capacidades nativas do Django para autenticação de usuários. Cobriremos um passo a passo sobre como implementar registro, login, log out e mudança de senhas com django-allauth usando somente o email como requerimento e dispensando o username padrão do Django.
Pacotes necessários
Para acompanhar o post na prática, é recomendado criar um ambiente virtual. Nele, instale o Django e o pacote django-allauth:
pip install Django
pip install django-allauth
Garanta que sua versão do django-allauth é recente, pois os comandos que usaremos não funcionam em versões antigas. O código do post foi feito usando Django 5.1.6 e django-allauth 65.4.1.
início do projeto
Após as instalações, crie um novo projeto Django. O chamaremos de config:
django-admin startproject config
A estrutura do projeto criado é essa:

Configuração do arquivo settings
O passo seguinte é fazer uma extensa configuração do arquivo settings.py. Localize o arquivo settings.py na pasta interna config. Nele, o primeiro passo é inserir dois novos apps na lista de apps instalados:
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"allauth", # novo
"allauth.account", # novo
]
Adicione o middleware necessário:
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"allauth.account.middleware.AccountMiddleware", # novo
]
Adicione o backend de autenticação como mostrado abaixo:
# novo
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'allauth.account.auth_backends.AuthenticationBackend',
]
Também precisamos informar ao Django onde localizar os templates que usaremos. Portanto, localize no arquivo settings.py TEMPLATES “DIRS” e insira o local dos templates como mostrado abaixo:
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [BASE_DIR / "templates"], # novo
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]
Django-allauth: configurações e personalizações
Ainda no arquivo settings, agora iniciaremos as configurações que podem ser personalizadas conforme suas necessidades. O pacote django-allauth é bem rico em opções (veja aqui a lista). Faremos as mais comuns, mas você deve visitar o site oficial e conhecer outras opções disponíveis.
Primeiro, definimos uma id para o site. O default é 1 (ainda no arquivo settings.py).
SITE_ID = 1
Depois, podemos determinar se queremos enviar um email de verificação quando um usuário cria uma conta. Para esse post, deixaremos essa opção como nula.
ACCOUNT_EMAIL_VERIFICATION = 'none'
Outra configuração importante é a definição da URL para qual o usuário é após entrar no app ou se registrar com sucesso. Selecionaremos a página home:
LOGIN_REDIRECT_URL = '/'
Em seguida, definimos os métodos que desejamos como login. Embora ainda seja comum vermos aplicativos que usam email e username, em aplicativos modernos, o mais popular é encontrar apenas email como opção. (Também existe a opção muito popular de login social que será tema para outro post). Para usar somente o email (alterando o modo padrão de autenticação do django), adicionamos essa linha ao nosso arquivo settings.py:
# cancela uso de username
ACCOUNT_LOGIN_METHODS = ["email"]
ACCOUNT_SIGNUP_FIELDS = ['email*', 'password1*', 'password2*']
Com essas configurações, nosso arquivo settings está pronto.
Arquivo urls.py
Ainda na pasta config interna, precisamos adicionar as urls do django-allauth no arquivo urls.py:
from django.contrib import admin
from django.urls import path, include # precisa adicionar include aqui
urlpatterns = [
path("admin/", admin.site.urls),
path("accounts/", include("allauth.urls")), # novo - urls django-allauth
]
Django-allauth: URLS de login, sign up, logout e password reset
Antes de continuarmos, é hora de atualizar as migrações do nosso projeto. Digite no terminal (você precisa estar dentro da pasta principal do projeto onde está o arquivo manage.py):
python manage.py migrate
Com esses passos, as páginas login, logout, register e passoword_reset já estão disponíveis para você. Elas estão disponíveis nas seguintes URLs:
login: http://127.0.0.1:8000/accounts/login/
sign-up: http://127.0.0.1:8000/accounts/signup/
logout: http://127.0.0.1:8000/accounts/logout/
Mudança de senha: http://127.0.0.1:8000/accounts/password/reset/
Para acessá-las, execute o comando no terminal para iniciar o servidor de desenvolvimento e vá até os endereços mostrados acima:
python manage.py runserver

Página de login padrão do django-allauth.

Página de sign up (registro) padrão do django-allauth.

Página de mudança de senha (password reset) padrão do django-allauth.
Pasta de templates e página home
Nosso de sistema de autenticação de usuários está funcionando corretamente, mas ainda não está completo. Nenhum usuário irá acessar as páginas usando diretamente os links mostrados acima quando ele entrar no nosso app. Precisamos ter uma página inicial. Portanto, criaremos uma página home onde os usuários podem ser direcionados para as páginas de registro, login, etc.
Primeiro, adicione a página home no arquivo urls.py. Para simplificar, usaremos uma class view:
from django.contrib import admin
from django.urls import path, include
from django.views.generic import TemplateView # novo
urlpatterns = [
path("admin/", admin.site.urls),
path("accounts/", include("allauth.urls")),
path("", TemplateView.as_view(template_name="home.html")), # novo
]
Depois, na pasta config externa, crie uma pasta chamada templastes e, dentro dela, um arquivo _base.html e um arquivo home.html. Com isso, a estrutura completa do nosso projeto fica assim:

Pasta de templates e arquivo _base.html
Em Django, assim como em outros frameworks web, é comum a presença de um arquivo HTML básico, que contém configurações e pacotes gerais usados em todas as páginas do app. As outras páginas do projeto costumam ser extensões deste arquivo. Com essa estrutura, o Django evita a repetição de diversas linhas de código que precisaríamos em cada página. Portanto, essa é a funcao do arquivo _base.html. O uso do símbolo “_” antes do nome base.html é uma convenção comum tipicamente usada para nomear arquivos parciais.
Usaremos bootstrap para adicionar configurações de estilo ao nosso site. Ele deve ser adicionado ao arquivo _base.html. No mesmo arquivo, bem no início, também faremos o load do django-allauth. Portanto, nosso arquivo _base.html completo é esse:
{% load allauth %}
Document
{% block content %} {% endblock %}
Arquivo home.html
O arquivo home.html será bem simples. Ele estende o arquivo _base.html e possui classes bootstrap para adicionar algum estilo a seus elementos. Note que todo conteúdo desta página é mostrado dentro das tags {% block content %} e {% endblock content %}. Nosso conteúdo possui apenas uma saudação e os botões com links para registro, login e mudança de senha:
{% extends "_base.html" %} {% block content %}
Bem-vindos ao meu site
{% endblock content %}
Note que os botões são definidos como links já contendo o endereço correto para cada URL.
Uso de condicionais no template para mostrar botão de logout
Mas onde está o botão para logout (sair)? Todo usuário que entra numa área restrita em um site precisa ter uma forma de sair. Isso geralmente é feito com o botão de logout. É claro que somente usuários logados podem sair, portanto, usaremos um condicional para mostrar o botão de logout somente para usuários autenticados. Da mesma forma, precisamos mostrar opções de login e registro apenas para usuários que não estão logados no site. Portanto, eles também devem estar dentro de nosso condicional. Para criar o condicional, usamos a variável já disponível no modelo de autenticação de usuários user.is_authenticated. Ela retorna True para usuários autenticados no app. Veja as modificações no template home.html abaixo:
{% extends "_base.html" %} {% block content %}
Bem-vindos ao meu site
Selecione uma opção:
{% if user.is_authenticated %}
Sair
{% else %}
Registrar
Entrar
Mudar Senha
{% endif %}
{% endblock content %}
Agora teste a sua aplicação registrando um usuário de teste para ver o template mudar quando ele se registra:

Página home para usuários não autenticados.
Ao completar seu registro, o usuário é corretamente enviado para a página home com a opção de sair (logout). Ao clicarmos nessa opção, precisamos confirmá-la para sermos reenviados de volta para a página home com as opções de registro, entrar e mudar a senha.

Página home para usuários autenticados.