Resumo : neste tutorial, você aprenderá como usar o Django LoginView
para criar uma página de login para o Todo App.
Este tutorial começa onde o tutorial Django DeleteView parou.
O Django LoginView
permite que você exiba o formulário de login e processe a ação de login. Usaremos a LoginView
classe para criar uma página de login para o Todo App .
Você pode baixar o código final deste tutorial aqui.
Criando e configurando o aplicativo de usuários para o projeto de tarefas
O users
aplicativo terá as seguintes funcionalidades:
- Entrar sair
- Registro
- Redefinir senha
Neste tutorial, focaremos nas funções Login/Logout.
Primeiro, use o startapp
comando para criar o users
aplicativo:
django-admin startapp users
Linguagem de código: Python ( python )
A seguir, cadastre o users
aplicativo no settings.py
projeto:
INSTALLED_APPS = [
#...
'users'
]
Linguagem de código: Python ( python )
Em seguida, crie urls.py
no users
aplicativo com o seguinte código:
from django.urls import path
urlpatterns = []
Linguagem de código: Python ( python )
Depois disso, inclua o
do urls.py
users
aplicativo no
do projeto:urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('todo.urls')),
path('',include('users.urls'))
]
Linguagem de código: Python ( python )
Por fim, crie o templates
diretório e users
o diretório dentro do templates
diretório no users
aplicativo para armazenar os modelos.
Criando uma página de login
O seguinte define a classe no arquivo que herda da classe:My
LoginView
views.py
LoginView
from django.contrib.auth.views import LoginView
from django.urls import reverse_lazy
from django.contrib import messages
class MyLoginView(LoginView):
redirect_authenticated_user = True
def get_success_url(self):
return reverse_lazy('tasks')
def form_invalid(self, form):
messages.error(self.request,'Invalid username or password')
return self.render_to_response(self.get_context_data(form=form))
Linguagem de código: Python ( python )
Como funciona.
Primeiro, importe o LoginView
arquivo
. django.contrib
auth.views
, reverse_lazy
de django.urls
e mensagens dedjango.contrib
from django.contrib.auth.views import LoginView
from django.urls import reverse_lazy
from django.contrib import messages
Linguagem de código: Python ( python )
Segundo, defina a classe que herda da classe. O possui os seguintes atributos e métodos:My
LoginView
LoginView
My
LoginView
está configurado pararedirect_authenticated_user
True
instruir o Django a redirecionar os usuários assim que eles efetuarem login com sucesso. Por padrão,
isredirect_authenticated_user
False
, que desativa o redirecionamento.get_success_url()
retorna o URL para redirecionar depois que os usuários fizerem login com sucesso.
é chamado quando o login falha. Noform_invalid()
, criamos uma mensagem flash e renderizamos novamente o formulário de login.form_invalid()
Definindo uma rota para a página de login
Modifique o views.py
arquivo para definir uma rota para a página de login:
from django.urls import path
from .views import MyLoginView
urlpatterns = [
path('login/', MyLoginView.as_view(),name='login'),
]
Linguagem de código: Python ( python )
Como funciona.
Primeiro, importe a MyLoginView
classe do views.py
:
from .views import MyLoginView
Linguagem de código: Python ( python )
Segundo, mapeie a login/
rota para o resultado do as_view()
método da MyLoginView
classe.
urlpatterns = [
path('login/', MyLoginView.as_view(),name='login'),
]
Linguagem de código: Python ( python )
Criando um modelo de login
Primeiro, crie o login.html
modelo no templates/users
diretório com o seguinte código:
{%extends 'base.html'%}
{%block content%}
<div class="center">
<form method="post" class="card" novalidate>
{% csrf_token %}
<h2 class="text-center">Log in to your account</h2>
{% for field in form %}
{{ field.label_tag }}
{{ field }}
{% if field.errors %}
<small>{{ field.errors|striptags }}</small>
{% endif %}
{% endfor %}
<input type="submit" value="Login" class="btn btn-primary full-width">
<hr>
<p class="text-center">Forgot your password <a href="#">Reset Password</a></p>
<p class="text-center">Don't have a account? <a href="#">Join Now</a></p>
</form>
</div>
{%endblock content%}
Linguagem de código: HTML, XML ( xml )
Se você abrir o URL de login:
http://127.0.0.1:8000/login/
Linguagem de código: Python ( python )
você verá o seguinte formulário de login:
Se você inserir um nome de usuário e senha válidos, você fará login com sucesso. Caso contrário, você receberá uma mensagem informando que digitou um nome de usuário ou senha inválidos.
Em segundo lugar, adicione ao LOGIN_URL
do settings.py
projeto:
LOGIN_URL = 'login'
Linguagem de código: Python ( python )
Se você tentar acessar uma página que requer login, o Django usará isso
para redirecionamento. Se você não adicionar o LOGIN_URL
, LOGIN_URL
settings.py
o Django usará a URL de login padrão que é accounts/login/
.
Criando um URL de logout
O
desconecta um usuário e exibe uma mensagem. Usaremos o LogoutView
para criar um link de logout.LogoutView
Ao contrário da LoginView
classe, você pode usar a LogoutView
classe diretamente no arquivo urls.py
. Por exemplo, você pode modificar views.py
para criar uma rota para o URL de logout:
from django.urls import path
from .views import MyLoginView
from django.contrib.auth.views import LogoutView
urlpatterns = [
path('login/', MyLoginView.as_view(),name='login'),
path('logout/', LogoutView.as_view(next_page='login'),name='logout'),
]
Linguagem de código: Python ( python )
Como funciona.
Primeiro, importe o LogoutView
arquivo django.contrib
. auth.views
:
from django.contrib.auth.views import LogoutView
Linguagem de código: Python ( python )
Segundo, mapeie a URL logout/
com o resultado do as_view()
método da LogoutView
classe. O next_page
argumento especifica a URL para a qual os usuários serão redirecionados assim que efetuarem logout com êxito.
path('logout/', LogoutView.as_view(next_page='login'),name='logout')
Linguagem de código: Python ( python )
Adicionando links de login/logout ao cabeçalho
Se o usuário fizer login, o cabeçalho mostrará a página inicial, minhas tarefas, nova tarefa e link de logout. Depois que o usuário efetua logout, o cabeçalho exibe os links inicial, faça login e inscreva-se agora.
Para conseguir isso, você modifica o base.html
modelo do projeto da seguinte maneira.
{%load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="{% static 'css/style.css' %}" />
<title>Todo List</title>
</head>
<body>
<header class="header">
<div class="container">
<a href="{%url 'home'%}" class="logo">Todo</a>
<nav class="nav">
<a href="{%url 'home'%}"><i class="bi bi-house-fill"></i> Home</a>
{% if request.user.is_authenticated %}
<a href="{% url 'tasks' %}"><i class="bi bi-list-task"></i> My Tasks</a>
<a href="{% url 'task-create' %}"><i class="bi bi-plus-circle"></i> Create Task</a>
<a href="#">Hi {{request.user | title}}</a>
<a href="{% url 'logout' %}" class="btn btn-outline">Logout</a>
{% else %}
<a href="{% url 'login' %}" class="btn btn-outline">Login</a>
<a href="#" class="btn btn-primary">Join Now</a>
{% endif %}
</nav>
</div>
</header>
<main>
<div class="container">
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{message.tags}}">
{{message}}
</div>
{% endfor %}
{% endif %}
{%block content %}
{%endblock content%}
</div>
</main>
<footer class="footer">
<div class="container">
<p>© Copyright {% now "Y" %} by <a href="https://tutorials.acervolima.com">Python Tutorial</a></p>
</div>
</footer>
</body>
</html>
Linguagem de código: HTML, XML ( xml )
Observe que se o usuário fizer login, o request.user.is_authenticated
arquivo retornará True
. Portanto, você pode usar esta propriedade para verificar se um usuário está logado ou não.
Se você não estiver logado, verá os seguintes links na navegação:
No entanto, se você fizer login, verá os seguintes links de navegação:
LoginRequeridoMixin
Embora não esteja conectado, você ainda pode gerenciar a lista de tarefas, como visualizar, adicionar, editar e excluir tarefas. Para proteger essas páginas, você usará a LoginRequiredMixin
classe.
Para fazer isso, você modifica o views.py
aplicativo todo e usa a LoginRequiredMixin
classe da seguinte maneira:
from django.shortcuts import render
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.contrib import messages
from django.urls import reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Task
class TaskDelete(LoginRequiredMixin, DeleteView):
model = Task
context_object_name = 'task'
success_url = reverse_lazy('tasks')
def form_valid(self, form):
messages.success(self.request, "The task was deleted successfully.")
return super(TaskDelete,self).form_valid(form)
class TaskUpdate(LoginRequiredMixin, UpdateView):
model = Task
fields = ['title','description','completed']
success_url = reverse_lazy('tasks')
def form_valid(self, form):
messages.success(self.request, "The task was updated successfully.")
return super(TaskUpdate,self).form_valid(form)
class TaskCreate(LoginRequiredMixin, CreateView):
model = Task
fields = ['title','description','completed']
success_url = reverse_lazy('tasks')
def form_valid(self, form):
form.instance.user = self.request.user
messages.success(self.request, "The task was created successfully.")
return super(TaskCreate,self).form_valid(form)
class TaskDetail(LoginRequiredMixin, DetailView):
model = Task
context_object_name = 'task'
class TaskList(LoginRequiredMixin,ListView):
model = Task
context_object_name = 'tasks'
def home(request):
return render(request,'home.html')
Linguagem de código: Python ( python )
Se você não fez login e tentou acessar uma página protegida, o Django irá redirecioná-lo para a página de login. Por exemplo:
http://127.0.0.1:8000/task/create
Linguagem de código: Python ( python )
O Django irá redirecioná-lo para a página de login usando o LOGIN_URL
configurado em settings.py
:
http://127.0.0.1:8000/login/?next=/task/create/
Linguagem de código: Python ( python )
Resumo
- Use a
LoginView
classe para criar uma página de login. - Use a
LogoutView
classe para desconectar um usuário. - Use a
LoginRequiredMixin
classe para proteger uma página.