Django - Sesiones

Como se mencionó anteriormente, podemos usar cookies del lado del cliente para almacenar una gran cantidad de datos útiles para la aplicación web. Hemos visto antes que podemos usar cookies del lado del cliente para almacenar varios datos útiles para nuestra aplicación web. Esto conduce a muchos agujeros de seguridad dependiendo de la importancia de los datos que desee guardar.

Por razones de seguridad, Django tiene un marco de sesión para el manejo de cookies. Las sesiones se utilizan para abstraer la recepción y el envío de cookies, los datos se guardan en el lado del servidor (como en la base de datos) y la cookie del lado del cliente solo tiene un ID de sesión para identificación. Las sesiones también son útiles para evitar casos en los que el navegador del usuario está configurado para 'no aceptar' cookies.

Configurar sesiones

En Django, la habilitación de la sesión se realiza en su proyecto settings.py, agregando algunas líneas al MIDDLEWARE_CLASSES y el INSTALLED_APPSopciones. Esto debe hacerse mientras se crea el proyecto, pero siempre es bueno saberlo, así queMIDDLEWARE_CLASSES debería tener -

'django.contrib.sessions.middleware.SessionMiddleware'

Y INSTALLED_APPS debería tener -

'django.contrib.sessions'

De forma predeterminada, Django guarda la información de la sesión en la base de datos (tabla o colección django_session), pero puede configurar el motor para almacenar información usando otras formas como: en file o en cache.

Cuando la sesión está habilitada, cada solicitud (primer argumento de cualquier vista en Django) tiene un atributo de sesión (dict).

Creemos una muestra simple para ver cómo crear y guardar sesiones. Hemos construido un sistema de inicio de sesión simple antes (consulte el capítulo de procesamiento de formularios de Django y el capítulo de manejo de cookies de Django). Guardemos el nombre de usuario en una cookie para que, si no cierra sesión, cuando acceda a nuestra página de inicio de sesión, no vea el formulario de inicio de sesión. Básicamente, hagamos que nuestro sistema de inicio de sesión que usamos en el manejo de cookies de Django sea más seguro, guardando las cookies del lado del servidor.

Para esto, primero cambiemos nuestra vista de inicio de sesión para guardar el lado del servidor de cookies de nuestro nombre de usuario -

def login(request):
   username = 'not logged in'
   
   if request.method == 'POST':
      MyLoginForm = LoginForm(request.POST)
      
      if MyLoginForm.is_valid():
         username = MyLoginForm.cleaned_data['username']
         request.session['username'] = username
      else:
         MyLoginForm = LoginForm()
			
   return render(request, 'loggedin.html', {"username" : username}

Luego, creemos la vista formView para el formulario de inicio de sesión, donde no mostraremos el formulario si la cookie está configurada -

def formView(request):
   if request.session.has_key('username'):
      username = request.session['username']
      return render(request, 'loggedin.html', {"username" : username})
   else:
      return render(request, 'login.html', {})

Ahora cambiemos el archivo url.py para cambiar la URL para que se empareje con nuestra nueva vista:

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

urlpatterns = patterns('myapp.views',
   url(r'^connection/','formView', name = 'loginform'),
   url(r'^login/', 'login', name = 'login'))

Al acceder a / myapp / connection, podrá ver la siguiente página:

Y será redirigido a la siguiente página:

Ahora, si intenta acceder a / myapp / connection nuevamente, será redirigido directamente a la segunda pantalla.

Creemos una vista de cierre de sesión simple que borre nuestra cookie.

def logout(request):
   try:
      del request.session['username']
   except:
      pass
   return HttpResponse("<strong>You are logged out.</strong>")

Y emparejarlo con una URL de cierre de sesión en myapp / url.py

url(r'^logout/', 'logout', name = 'logout'),

Ahora, si accede a / myapp / logout, obtendrá la siguiente página:

Si vuelve a acceder a / myapp / connection, obtendrá el formulario de inicio de sesión (pantalla 1).

Algunas acciones más posibles mediante sesiones

Hemos visto cómo almacenar y acceder a una sesión, pero es bueno saber que el atributo de sesión de la solicitud tiene algunas otras acciones útiles como:

  • set_expiry (value) - Establece el tiempo de vencimiento de la sesión.

  • get_expiry_age() - Devuelve el número de segundos hasta que expire esta sesión.

  • get_expiry_date() - Devuelve la fecha de caducidad de esta sesión.

  • clear_expired() - Elimina las sesiones caducadas del almacén de sesiones.

  • get_expire_at_browser_close() - Devuelve Verdadero o Falso, dependiendo de si las cookies de sesión del usuario han expirado cuando se cierra el navegador web del usuario.