Login do DjangoView

Resumo : neste tutorial, você aprenderá como usar o Django LoginViewpara criar uma página de login para o Todo App.

Este tutorial começa onde o  tutorial Django DeleteView  parou.

O Django LoginViewpermite que você exiba o formulário de login e processe a ação de login. Usaremos a LoginViewclasse 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 usersaplicativo terá as seguintes funcionalidades:

  • Entrar sair
  • Registro
  • Redefinir senha

Neste tutorial, focaremos nas funções Login/Logout.

Primeiro, use o startappcomando para criar o usersaplicativo:

django-admin startapp usersLinguagem de código:  Python  ( python )

A seguir, cadastre o usersaplicativo no settings.pyprojeto:

INSTALLED_APPS = [
    #...
    'users'
]Linguagem de código:  Python  ( python )

Em seguida, crie urls.pyno usersaplicativo com o seguinte código:

from django.urls import path

urlpatterns = []Linguagem de código:  Python  ( python )

Depois disso, inclua o urls.pydo usersaplicativo no urls.pydo projeto:

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 templatesdiretório e userso diretório dentro do templatesdiretório no usersaplicativo para armazenar os modelos.

Criando uma página de login

O seguinte define a classe no arquivo que herda da classe:MyLoginViewviews.pyLoginView

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 LoginViewarquivo django.contrib. auth.views, reverse_lazyde django.urlse mensagens dedjango.contrib

from django.contrib.auth.views import LoginView
from django.urls import reverse_lazy
from django.contrib import messagesLinguagem de código:  Python  ( python )

Segundo, defina a classe que herda da classe. O possui os seguintes atributos e métodos:MyLoginViewLoginViewMyLoginView

  • redirect_authenticated_userestá configurado para Trueinstruir o Django a redirecionar os usuários assim que eles efetuarem login com sucesso. Por padrão, redirect_authenticated_useris False, que desativa o redirecionamento.
  • get_success_url()retorna o URL para redirecionar depois que os usuários fizerem login com sucesso.
  • form_invalid()é chamado quando o login falha. No form_invalid(), criamos uma mensagem flash e renderizamos novamente o formulário de login.

Definindo uma rota para a página de login

Modifique o views.pyarquivo 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 MyLoginViewclasse do views.py:

from .views import MyLoginViewLinguagem de código:  Python  ( python )

Segundo, mapeie a login/rota para o resultado do as_view()método da MyLoginViewclasse.

urlpatterns = [
    path('login/', MyLoginView.as_view(),name='login'),
]Linguagem de código:  Python  ( python )

Criando um modelo de login

Primeiro, crie o login.htmlmodelo no templates/usersdiretó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_URLdo settings.pyprojeto:

LOGIN_URL = 'login'Linguagem de código:  Python  ( python )

Se você tentar acessar uma página que requer login, o Django usará isso LOGIN_URLpara redirecionamento. Se você não adicionar o LOGIN_URL, settings.pyo Django usará a URL de login padrão que é accounts/login/.

Criando um URL de logout

O LogoutViewdesconecta um usuário e exibe uma mensagem. Usaremos o LogoutViewpara criar um link de logout.

Ao contrário da LoginViewclasse, você pode usar a LogoutViewclasse diretamente no arquivo urls.py. Por exemplo, você pode modificar views.pypara 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 LogoutViewarquivo django.contrib. auth.views:

from django.contrib.auth.views import LogoutViewLinguagem de código:  Python  ( python )

Segundo, mapeie a URL logout/com o resultado do as_view()método da LogoutViewclasse. O next_pageargumento 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.htmlmodelo 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_authenticatedarquivo 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 LoginRequiredMixinclasse.

Para fazer isso, você modifica o views.pyaplicativo todo e usa a LoginRequiredMixinclasse 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/createLinguagem de código:  Python  ( python )

O Django irá redirecioná-lo para a página de login usando o LOGIN_URLconfigurado em settings.py:

http://127.0.0.1:8000/login/?next=/task/create/Linguagem de código:  Python  ( python )

Resumo

  • Use a LoginViewclasse para criar uma página de login.
  • Use a LogoutViewclasse para desconectar um usuário.
  • Use a LoginRequiredMixinclasse para proteger uma página.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *