Cómo manejar la autenticación de usuario en Python Django

En este tutorial, mostraré cómo iniciar sesión, cerrar sesión y registrarse en Django. Todo el código que describo aquí está en este repositorio de GitHub. Este tutorial utilizará Python 2.7 y Django 1.9.

Instalación y estructura del proyecto

Para comenzar, ejecute los siguientes comandos desde la terminal:

django-admin startproject src cd src python manage.py startapp mysite python manage.py migrate

En pocas palabras, estos cuatro comandos crean un nuevo proyecto Django llamado src, ingresan al proyecto, crean una nueva aplicación, mysite, dentro del proyecto src, luego crean una base de datos SQLite para el proyecto llamado db.sqlite3. También asegúrese de incluir la aplicación mysite dentro de src / settings.py.

INSTALLED_APPS = [ 'src', 'django.contrib.admin', 'django.contrib.auth', ... ]

Cree un directorio llamado templates dentro de la aplicación mysite. Luego cree otros dos directorios dentro de misitio / plantillas llamados "registro" y "misitio".

Además, me referiré a las plantillas almacenadas en estos dos directorios, usando registration / {template_name} y mysite / {template_name}.

En última instancia, la estructura de su proyecto debería verse así:

. |-- db.sqlite3 |-- manage.py |-- mysite | |-- admin.py | |-- apps.py | |-- __init__.py | |-- migrations | | `-- __init__.py | |-- models.py | |-- templates | | |-- mysite | | `-- registration | |-- tests.py | `-- views.py `-- src |-- __init__.py |-- settings.py |-- urls.py `-- wsgi.py

Es posible que ya pueda averiguar para qué se pueden usar las plantillas en mysite (vistas definidas en mysite, por ejemplo). Pronto llegaremos a la importancia del registro.

Además, necesitaremos que los usuarios prueben nuestro sitio. Puede hacer esto creando un superusuario ( python manage.py createsuperuser). Pero no se preocupe, todo lo que describe este tutorial también se puede aplicar a usuarios normales, sin ningún cambio. Puede crear usuarios normales para este tutorial creando un superusuario, ejecutando su servidor de desarrollo ( python manage.py runserver), navegando a localhost: 8000 / admin, navegando a Usuarios y luego creando un nuevo usuario.

Manejo de inicio de sesión

Según la documentación, Django proporciona vistas para manejar métodos de autenticación de usuarios como inicio de sesión, cierre de sesión y recuperación de contraseña. Esto nos ahorra la molestia de tener que definir nuestros propios puntos de vista para manejar esas cosas. Además, estas vistas son bastante configurables y están incluidas en django.contrib.auth.views, que importaremos de la siguiente manera:

from django.contrib.auth import views as auth_views

Queremos que la página de inicio de sesión se abra cuando el usuario vaya a / login. Para usar la vista de inicio de sesión, agregue lo siguiente en src / urls.py

url(r'^login/$', auth_views.login),

La vista por defecto representa una plantilla que está en registration / login.html.

Nuestro registro / login.html incluye el siguiente formulario HTML simple:

   Login    {% csrf_token %} 

Username

Password

Login

¿No desea utilizar registration / login.html? Puede especificar qué plantillas usar dando un diccionario de Python como tercer parámetro en el patrón de URL, con 'template_name' como clave y la ubicación de la plantilla como valor. Si desea utilizar mysite / login_user.html como plantilla:

url(r'^login/$', auth_views.login, {'template_name': 'mysite/login_user.html'})

Además, también puede usar otros argumentos de la vista, prácticamente de la misma manera. Para obtener una lista completa de argumentos, consulte los documentos.

Cuando el usuario hace clic en el botón enviar, la vista de inicio de sesión gestiona el inicio de sesión por nosotros. Una vez que el usuario ha iniciado sesión, podemos definir dónde se debe redirigir la página especificando LOGIN_REDIRECT_URL en src / settings.py. De forma predeterminada, seremos redirigidos a / login si falla el inicio de sesión.

LOGIN_REDIRECT_URL = '/'

Ahora ejecute el servidor de desarrollo ( python manage.py runserver) y navegue hasta localhost: 8000 / login /. Ingrese las credenciales de usuario para su superusuario de ejemplo. Serás redirigido a / si el inicio de sesión fue exitoso. De lo contrario, será redirigido a / login.

Incluso si su inicio de sesión fue exitoso, será redirigido a / y verá un error. Esto sucederá porque no hemos definido una urlpatternpara ello.

Manejo del cierre de sesión

A continuación, queremos que los usuarios cierren la sesión cuando naveguen a / logout. Podemos extender la misma analogía que iniciar sesión para cerrar sesión, accediendo a la vista correspondiente al cierre de sesión agregando el siguiente patrón de URL a src / settings.py

url(r'^logout/$', auth_views.logout)

La vista de cierre de sesión muestra la plantilla registration / connected_out.html de forma predeterminada. Aquí hay una plantilla de cierre de sesión simple:

      You have successfully logged out. Home  

Al igual que con el inicio de sesión, puede cambiar la ubicación de la plantilla al incluir un objeto con una clave 'template_name' y la ubicación de la plantilla como valor.

Regístrate

Queremos que nuestros usuarios se registren en nuestro sitio web navegando a / registrarse. Antes de hacer eso, limpiemos un poco el proyecto. En primer lugar, queremos un urlpatternpara nuestra página de inicio /. Vamos a usar la aplicación mysite para este propósito, así que agregue lo siguiente en src / urls.py

url(r'^', include('mysite.urls'))

Ahora necesitamos incluir el urlpatternfor / en mysite / urls.py, así que incluya lo siguiente urlpatternen él (después de importar las bibliotecas relevantes)

from django.conf.urls import url, include from django.contrib import admin from .views import home, register urlpatterns = [ url(r'^$', home), url(r'^register/', register), ]

Aquí, se homerefiere a la vista para /, y se registerrefiere a la vista para manejar el registro. Para crear un formulario de registro de usuario, usaremos los formularios integrados de Django. Para hacer esto, cree un archivo mysite / forms.py e incluya lo siguiente:

from django import forms class UserRegistrationForm(forms.Form): username = forms.CharField( required = True, label = 'Username', max_length = 32 ) email = forms.CharField( required = True, label = 'Email', max_length = 32, ) password = forms.CharField( required = True, label = 'Password', max_length = 32, widget = forms.PasswordInput() )

First, we import the forms library, we create UserRegistrationForm, which inherits from forms.Form. We want our forms to have 3 fields: username, email, password and the variable assignments do just that. forms.CharField represents a field composed of characters. The arguments — required, max_length and label— specify whether a field is required, it’s maximum length, and the field’s label. The widget parameter in password says that password is an input of type “password.”

We want users to be able to view the form if they go to /register, as well as fill it in and submit it. These correspond to GET and POST requests on /register. Thus, we include the following in mysite/views.py:

from django.shortcuts import render from django.contrib.auth.models import User from django.contrib.auth import authenticate, login from django.http import HttpResponseRedirect from django import forms from .forms import UserRegistrationForm # Create your views here. def home(request): return render(request, 'mysite/home.html') def register(request): if request.method == 'POST': form = UserRegistrationForm(request.POST) if form.is_valid(): userObj = form.cleaned_data username = userObj['username'] email = userObj['email'] password = userObj['password'] if not (User.objects.filter(username=username).exists() or User.objects.filter(email=email).exists()): User.objects.create_user(username, email, password) user = authenticate(username = username, password = password) login(request, user) return HttpResponseRedirect('/') else: raise forms.ValidationError('Looks like a username with that email or password already exists') else: form = UserRegistrationForm() return render(request, 'mysite/register.html', {'form' : form})

The home view is defined to render the src/home.html template, which is as follows:

   Home   {% if user.is_authenticated %} 

hello

welcome {{ user.username }}

Logout

{% else %}

Login

Register

{% endif %}

We check whether the user is logged in, using user.is_authenticated, and display our welcome text along with the username (using user.username) along with a link for logging out. If not, we will display links for logging in and registering.

For the register view, we check whether the request method is POST or not. If it isn’t, then we specify the form to be UserRegistrationForm and render, it by passing it as a parameter to mysite/register.html template:

       {% csrf_token %} {{ form.as_p }} Submit   

The form that is passed as input to the register view is then rendered using form.as_p. When the user clicks the submit button, a POST request is sent. We take the form data using the form variable.

Next we check if the form data is valid (through is_valid()). If it is, we create a userObj dictionary which we get by applying cleaned_data to the form and extract username, email and password from it.

The if condition checks whether it’s the case that a user with the same username and email exists in our database. If it is so, we create a new user, login using the same user and redirect to /. Otherwise, we raise an error saying that such a user already exists.

Here’s some relevant documentation in case you get stuck, or want to learn more:

  • User Authentication
  • Forms

If you would like to give me feedback about this tutorial, contact me.

If you liked this post, please ♡ it and share it :)