Autenticação de Usuários com Django
Neste post, exploraremos como configurar um sistema de autenticação de usuários no Django. Ele consistirá em login, logout e inscrição.
A autenticação de usuários no backend é o processo de verificação da identidade dos usuários antes de conceder a eles o acesso aos recursos de uma aplicação web. Ou seja, ele é o mecanismo de bastidores que garante que apenas usuários autorizados possam interagir com seu sistema.
Como o Django é um framework bastante completo para o desenvolvimento de aplicações web com Python, ele conta com um sistema padrão de autenticação de usuários. Voce pode saber mais sobre o Django aqui, aqui e aqui. Portanto, usaremos o sistema de autenticação padrão do Django. O post assume que você já possui alguma familiaridade com Django.
Setup Inicial
Os primeiros passos são básicos e envolvem criar um diretório dedicado para o projeto, ativar um ambiente virtual, instalar o Django e criar um projeto Django. O projeto pode ser chamado config:
django-admin startproject config
A estrutura do projeto criado é complexa e contém os seguintes arquivos:
Em seguida, fazemos a migração e iniciamos um servidor local para verificar que tudo correu bem com a instalação inicial. Na pasta do projeto, onde está o arquivo manage.py, digite o seguinte comando no terminal:
python manage.py migrate
python manage.py runserver
Se tudo correu bem com sua instalação, você deverá ver a página inicial de saudações do Django no endereço http://127.0.0.1:8000/.
Autenticação Padrão do Django
O módulo contrib do Django fornece aplicativos integrados para auxiliar no desenvolvimento de aplicações web. Entre esses aplicativos está uma autenticação de usuários praticamente pronta para uso. Sua presença pode ser verificada no arquivo settings.py na pasta interna do projeto em INSTALLED_APPS.
Para usar esse aplicativo de autenticação, precisamos adicioná-lo ao arquivo urls.py no nível do projeto. No início do código, é preciso importar o método include. Depois, adicionamos um novo caminho de URL chamado accounts/ que insere o aplicativo de autenticação para uso no nosso projeto. O nome accounts é o padrão. Portanto, modifique o arquivo urls.py conforme mostrado abaixo:
from django.contrib import admin
from django.urls import path, include # modifique aqui
urlpatterns = [
path("admin/", admin.site.urls),
path("accounts/", include("django.contrib.auth.urls")), # adicione isso
]
O aplicativo de autenticação de usuários padrão do Django já possui várias visualizações (views) de autenticação e URLs para lidar com login, logout, alteração de senha, redefinição de senha, etc. Veja a lista completa abaixo.
accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/// [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
Login com Django
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [BASE_DIR / "templates"], # modifique essa parte
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
...
Login
Não possui uma conta? Registrar
Este código é um formulário padrão do Django usando POST para enviar dados. A tag {% csrf_token %} precisa ser inserida por questões de segurança. O conteúdo do formulário é exibido com a tag {{ form.as_p }}. No final do código, o link está pronto para a página de inscrição ser inserida depois.
Para verificar a página de login, é preciso reiniciar o servidor local do Django e visitar o endereço: http://127.0.0.1:8000/accounts/login/. Nosso login está lá (imagem abaixo), porém ainda não temos uma conta de usuário para podermos logar. Para contornar esse problema, podemos criar a página de inscrição.
Redirecionamento e Página Home
LOGIN_REDIRECT_URL = "/" # adicione isso
Home
{% if user.is_authenticated %}
Oi {{ user.username }}!
{% else %}
Você não está logado
Log In
{% endif %}
Ele verifica se o usuário está logado e, em caso positivo, realiza uma saudação. Em caso negativo, a página de login é indicada.
No arquivo urls.py, adicione os seguintes trechos:
from django.contrib import admin
from django.urls import path, include
from django.views.generic.base import TemplateView # insira isso
urlpatterns = [
path("admin/", admin.site.urls),
path("accounts/", include("django.contrib.auth.urls")),
path("", TemplateView.as_view(template_name="home.html"), name="home"), # insira isso
]
Isso irá permitir que nossa aplicação exiba a página home, quando ela for solicitada (http://127.0.0.1:8000/). Evidentemente, não estamos adicionando nenhuma formatação de estilo ou personalização. Veja a documentação oficial do Django para obter informações sobre essas etapas.
Inscrição com Django
python manage.py startapp accounts
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"accounts", # insira isso
]
Em seguida, adicione um caminho de URL no arquivo urls.py do projeto. Ele precisa estar acima do nosso aplicativo de autenticação padrão do Django para garantir que a página de inscrição seja carregada primeiro.
from django.contrib import admin
from django.urls import path, include
from django.views.generic.base import TemplateView
urlpatterns = [
path("accounts/", include("accounts.urls")), # insira isso
path("admin/", admin.site.urls),
path("accounts/", include("django.contrib.auth.urls")),
path("", TemplateView.as_view(template_name="home.html"), name="home"),
]
Depois, crie um arquivo urls.py na pasta do app accounts. Insira esse código nele:
from django.urls import path
from .views import SignUp
urlpatterns = [
path("signup/", SignUp.as_view(), name="signup"),
]
No arquivo views.py na pasta do app accounts, definimos uma visualização para a página de inscrição:
from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
from django.views.generic import CreateView
class SignUp(CreateView):
form_class = UserCreationForm
success_url = reverse_lazy("login")
template_name = "registration/signup.html"
No diretório registration dentro do diretório templates, criamos o arquivo signup.html e adicionamos o seguinte código:
Inscrição
Com isso, a inscrição está pronta e já podemos nos cadastrar visitando a página http://127.0.0.1:8000/accounts/signup/.
Logout
Por fim, precisamos fazer o logout. Mas antes, no arquivo login.html, adicione a página de inscrição como mostrado abaixo (linha 7).
Login
Não possui uma conta? Registrar
O logout faz parte do app de autenticação de usuários padrão do Django. Para habilitá-lo, basta adicionar no arquivo home.html um formulário como mostrado abaixo (linhas 4-6). Ele adiciona um botão de logout.
Home
{% if user.is_authenticated %}
Oi {{ user.username }}!
{% else %}
Você não está logado
Log In
{% endif %}
Em seguida, informamos no arquivo settings.py para redirecionar o logout de volta para a página home como mostrado abaixo (adicione no final do arquivo):
LOGOUT_REDIRECT_URL = "/"
A estrutura completa do projeto final é mostrada abaixo:
Pronto! Com isso, configuramos as funcionalidades de login, inscrição e logout padrões do Django. Existem várias outras funcionalidades prontas para uso, como mudança e redefinição de senha. Mas elas ficam para outras ocasiões…