Red de conocimiento informático - Material del sitio web - Cómo utilizar sesiones de Django

Cómo utilizar sesiones de Django

Django es totalmente compatible con sesiones anónimas. El marco de sesión permite a cada usuario guardar y recuperar datos. Guarda datos en el lado del servidor y envuelve las operaciones de envío y recepción de cookies. La cookie contiene el ID de la sesión, no los datos en sí.

¿Habilitar sesión?

La sesión se implementa mediante middleware.

Para habilitar las sesiones, debe completar los siguientes pasos:

Modifique la configuración MIDDLEWARE_CLASSES y asegúrese de que contenga "django. contrib. sesiones. MIDDLEWARE. sesión MIDDLEWARE". El archivo settings.py predeterminado creado por django-admin.py startproject ya ha activado SessionMiddleware.

Agregue "django.contrib.Sessions" a la configuración INSTALLED_APPS y ejecute Manage.py syncdb para instalar la tabla utilizada para almacenar los datos de la sesión.

Cambios en Django 1.0: si no utiliza una base de datos para almacenar sesiones, puede ignorar este paso; consulte Configuración del motor de sesiones.

Si no desea utilizar sesiones, también puede eliminar la línea SessionMiddleware de MIDDLEWARE_CLASSES y 'django.contrib.sessions' de INSTALLED_APPS. Esto le ahorrará un pequeño gasto.

¿Configurar el motor de sesiones?

Nuevo en Django 1.0..

De forma predeterminada, Django almacena sesiones en la base de datos (usando el modelo Django . contrib . sesiones . modelos . Sesión ). Si bien esto es conveniente, en algunos casos es más rápido ubicar la sesión en otro lugar. Entonces Django te permite configurarlo para guardar datos de la sesión en el sistema de archivos o en un búfer.

¿Usar sesiones basadas en archivos?

Para usar sesiones basadas en archivos, configure SESSION_ENGINE en "django . contrib . sesiones . backs . archivo".

Es posible que también necesites modificar la configuración de SESSION_FILE_PATH para controlar dónde almacena Django los archivos de sesión. Por defecto utiliza tempfile.gettempdir(), normalmente /tmp.

¿Usar sesiones basadas en buffer?

Para utilizar el sistema de almacenamiento en búfer de Django para guardar sesiones, debes configurar SESSION_ENGINE en "Django. contrib. session. backs. cache". Debe asegurarse de que el búfer haya sido configurado; consulte la documentación del búfer para obtener más detalles.

Nota

Las sesiones basadas en búfer solo se pueden utilizar cuando se utiliza Memcached como fondo del búfer. Debido a que el tiempo para almacenar datos almacenados en el búfer es demasiado corto cuando se utiliza la memoria local como fondo del búfer, el acceso directo a archivos o bases de datos es más rápido que acceder a archivos o bases de datos mediante el almacenamiento en búfer.

¿Usar sesiones en vistas?

Después de abrir sessionMiddleware, cada objeto HttpRequest (el primer parámetro de la función de vista de Django) tiene un atributo de sesión, que es un objeto similar a un diccionario. Puedes leerlo y escribirlo directamente.

El objeto de sesión tiene las siguientes funciones de diccionario estándar:

__getitem__(palabra clave)

Ejemplo: fav _ color = request session[' fav _ color '. ]

__setitem__(clave, valor)

Ejemplo: solicitud sesión[' fav _ color ']= 'azul'

__delitem__(palabra clave)

p>

Ejemplo: del request . Esto generará un error de clave si la clave proporcionada no está en la sesión.

__contiene_ _(palabra clave)

Ejemplo: "color_favorito" en request.session

get(clave, predeterminado = Ninguno)

Ejemplo: fav_color = solicitud de sesión get('fav_color', 'rojo').

Key()

Project()

setdefault()

Clear()

Nuevo en Django Adición 1.0: esta versión agrega set default() y clear().

También tiene los siguientes métodos:

flush()

Nuevo en Django 1.0.

Elimina los datos de la sesión actual de la base de datos, regenera la clave de sesión y la envía al navegador. Este enfoque se puede utilizar cuando necesita asegurarse de que ya no se pueda acceder a los datos de la sesión desde el navegador del usuario, como cuando se llama a django.contrib.auth.logout().

set_test_cookie()

Establece cookies de detección para comprobar si el navegador del usuario admite cookies. Debido a la forma en que funcionan las cookies, no obtendrá los resultados de la prueba hasta la próxima solicitud del usuario. Para obtener más información, consulte la configuración a continuación para detectar cookies.

test_cookie_worked()

Determina si el navegador del usuario ha recibido una cookie de prueba y devuelve Verdadero o Falso. Debido a la forma en que funcionan las cookies, debes llamar a set_test_cookie() en una solicitud previa por separado. Para obtener más información, consulte la configuración a continuación para detectar cookies.

delete_test_cookie()

Para eliminar la cookie de detección, llame a esta función para borrar la cookie usted mismo.

set_expiry(value)

Nuevo en Django 1.0.

Establece el tiempo de vencimiento de la sesión. Puede proporcionar los siguientes valores:

Si el valor es un número entero, representa segundos. Por ejemplo, haga una llamada telefónica para solicitarlo. Session.set_expire (300) hará que la sesión caduque después de cinco minutos.

Si el valor es un objeto datetime o timedelta, la sesión caducará en la fecha u hora correspondiente.

Si este valor es 0, la sesión del usuario caducará cuando se cierre el navegador.

Si el valor es Ninguno, la sesión utilizará la política global para establecer el tiempo de vencimiento.

get_expiry_age()

Nuevo en Django 1.0.

Obtén el tiempo de vencimiento de esta sesión. Para sesiones sin un tiempo de vencimiento personalizado (o sesiones que expiran cuando se cierra el navegador), el valor de retorno de esta función es el mismo que el de la configuración. SESSION_COOKIE_AGE.

get_expiry_date()

Nuevo en Django 1.0.

Obtener el punto de vencimiento de esta sesión. Para sesiones sin un tiempo de vencimiento personalizado (o sesiones que expiran cuando se cierra el navegador), el valor de retorno de esta función es igual a la cantidad de segundos entre ahora y el tiempo establecido. SESSION_COOKIE_AGE.

get_expire_at_browser_close()

Nuevo en Django 1.0.

Devuelve si la sesión caduca cuando se cierra el navegador. El valor de retorno es Verdadero o Falso.

Puedes modificar request.session tantas veces como quieras, en cualquier lugar de la vista.

¿Guía de objetos de sesión?

Utilice cadenas de Python directamente como claves de diccionario a pedido. La sesión es más sencilla que usar los métodos del objeto de sesión.

En el diccionario de sesión, las claves que comienzan con un guión bajo están reservadas para uso interno de Django.

No sobrescriba request.session con un nuevo objeto y no acceda ni modifique sus propiedades. Sólo se puede utilizar como un objeto similar a un diccionario.

¿Un ejemplo?

Esta vista simple establece la variable has_commented en True después de que el usuario envía la información de evaluación para evitar que el usuario envíe la información de evaluación varias veces:

def post_comment(solicitud, nuevo_comentario): if request . session get ('ha _ comentado', False): return HttpResponse ("Ya has comentado"). c = comentario. comentario(comentario = nuevo _ comentario)c . save()request sesión[' ha _ comentado ']= True return HttpResponse('¡Gracias por tu comentario!')

Esta vista simple permite al sitio web inicio de sesión de 'usuario':

def inicio de sesión(solicitud): m = Miembro.objects.get(nombre de usuario = solicitud.POST['nombre de usuario']) si m.contraseña == solicitud. POST['contraseña']: solicitud. sesión ['miembro _ id'] = m .id return HttpResponse ("Usted ha iniciado sesión") else: return HttpResponse ("Su nombre de usuario y contraseña no coinciden"). p >

...En correspondencia con el ejemplo anterior, el siguiente ejemplo cierra la sesión del usuario:

def logout(request): try: del request[' member _ id '] excepto clave. error :pass return HttpResponse("Has cerrado sesión")

De hecho, el estándar django.contrib.auth.logout() hará más para evitar la fuga de datos involuntaria. Llama a la función request.session.flush(). Solo usamos estos ejemplos para demostrar cómo manipular objetos de sesión; esta no es una implementación completa de login().

¿Establecer cookies de detección?

Para mayor comodidad, Django proporciona una forma sencilla de detectar si el navegador del usuario admite cookies.

Simplemente llame a request.session.set_test_cookie() en una solicitud y a request.session.test_cookie_worked() en solicitudes posteriores. Tenga cuidado de no llamar a ambos en la misma solicitud.

La razón por la que set_test_Cookie() y test_cookie_worked() se llaman en dos solicitudes es por el modo de trabajo de Cookie. Cuando configura una cookie, no hay forma de saber si el navegador la recibirá antes de la siguiente solicitud.

Además, es mejor utilizar delete_test_cookie() para borrar los datos de la prueba después de la prueba.

El siguiente es un ejemplo típico:

def iniciar sesión (solicitud): si el método de solicitud == 'POST': si la sesión de solicitud _ cookie _ funcionó (). :request.session.delete_test_cookie()return HttpResponse("Ha iniciado sesión.")else: return HttpResponse("Habilite las cookies e inténtelo de nuevo").request.session.set_test_cookie()return render_ to _ respuesta(' foo/ iniciar sesión _form .html ')

¿Usar sesión fuera de la vista?

Nuevas funciones en Django 1.0.

Existe una API específica para manipular datos de sesión fuera de las vistas:

gt gt gt import session gt from django contrib session . session_key = ' 2b 1189 a 188 b 44 ad 18 c 35 e 113 AC 6 ceead ') gt; gt gts[' last_log in ']= fecha y hora (2005, 8, 20, 13, 35, 10)> gt gts. ['último _ inicio de sesión'] fecha y hora (2005, 8, 20, 13, 35, 0)> gt gt save()

Si usa sesiones backend de Django. entonces cada sesión es un modelo de Django normal. Las sesiones modelo se definen en el archivo django/contrib/sessions/models.py.

Debido a que es un modelo genérico, puedes acceder a él directamente usando la interfaz de programación de base de datos de Django:

gt gt gtimport session desde django.contrib.sessions.models gt gt gts = session get (PK = . ' 2b 1189 a 188 b 44 ad 18 c 35 e 113 AC 6 ceead ') gt; gt gt fecha hora (2005, 8, 20, 13, 35, 12)

Nota para obtener el diccionario de sesión, debe llamar a get_decoded(), porque el diccionario se almacena en codificación:

gt gt gts . session _ data ' kgrwmqptj 19 hdx rox 3 vzzxjfawqncnayckkxcnmumtexy 2 zjodi 2 yj ... ' gt gt gts.get_decoded() {'user_id': 42}

¿Cuándo se almacena la sesión?

Por defecto, Django solo guarda la sesión cuando se modifica la sesión, es decir, solo guarda la sesión cuando se modifica o elimina el valor en el diccionario:

#Session ha sido modificado. request . Session['foo']= 'bar' # Se modifica la sesión. del request.session['foo'] #La sesión ha sido modificada. request . Session[' foo ']= { } # Gotcha: No modifiques la sesión, ya que esto cambiará # request.session['foo'], no request . ' ]= ' baz '

Para el último anterior, puede notificar al objeto de sesión que ha sido modificado estableciendo explícitamente la propiedad modificada del objeto de sesión:

request.session. modificado = Verdadero

Para cambiar este comportamiento, establezca SESSION_SAVE_EVERY_REQUEST en Verdadero. Si SESSION_SAVE_EVERY_REQUEST es True, Django guardará la sesión después de cada solicitud independiente.

Tenga en cuenta que las cookies de sesión solo se envían cuando se crea o modifica una sesión. Si SESSION_SAVE_EVERY_REQUEST es Verdadero, la cookie se enviará cada vez que se realice una solicitud.

De manera similar, cuando se envía una cookie, su parte de vencimiento se actualiza cada vez.

¿Sincronización de sesiones con navegador y sesión persistente?

Al configurar Session_expire_at_browser_close, puede controlar el marco de la sesión para utilizar una sesión sincronizada con el navegador o una sesión persistente.

De forma predeterminada, el valor de Session_expire_at_browser_close es False, lo que significa que la cookie de sesión se guardará en el navegador del usuario hasta que se supere el SESSION_COOKIE_AGE. Utilice este método si no desea que el usuario inicie sesión cada vez que cierra el navegador.

Si session_expire_at_browser_close se establece en True, Django utilizará una cookie que se sincroniza con el navegador, es decir, la cookie caducará cuando el usuario cierre el navegador.

Utilice este modo si desea que los usuarios inicien sesión cada vez que abran el navegador.

Nuevas funciones en Django 1.0.

Esta configuración tiene un valor predeterminado global, pero puedes establecer un valor independiente para cada sesión llamando a request. sesión. set_expire(), el contenido relevante se describe utilizando la vista de sesión mencionada anteriormente.

¿Borrar tabla de sesiones?

Tenga en cuenta que los datos de la sesión pueden acumularse en la tabla de la base de datos Django_session, y Django no proporciona la función para borrarlos automáticamente. Le deja a usted la tarea de borrar periódicamente los datos de la sesión.

Para entender este problema, imaginemos lo que sucede cuando un usuario utiliza una sesión. Cuando un usuario inicia sesión, Django agrega un registro a la tabla django_session. Django actualiza este registro cada vez que cambian los datos de la sesión. Si el usuario cierra sesión manualmente, Django lo eliminará. Sin embargo, si el usuario no cierra sesión, el registro nunca se eliminará.

Django proporciona un script de muestra de limpieza django-admin.py, que puede completar la función de limpieza. Elimina aquellos registros de la tabla de sesión cuya fecha de vencimiento ha caducado, pero su aplicación puede tener otros requisitos.

¿Configuración?

Algunas configuraciones de Django pueden ayudarte a controlar el comportamiento de las sesiones:

session_engine?

Nuevas funciones en Django 1.0.

Valor predeterminado: django .contrib sesiones .

Controla dónde Django guarda los datos de la sesión. Los valores legales incluyen:

' django .sesiones .db '

' django sesiones . django .contrib .sesiones .backends .cache '

Para obtener más información, consulte Configuración del motor de sesión.

¿Ruta_archivo_sesión?

Nuevas funciones en Django 1.0.

Predeterminado: /tmp/

Si se utiliza almacenamiento de sesión basado en archivos, esta variable controla el directorio en el que Django almacena los datos de la sesión.

¿SESSION_COOKIE_AGE?

Valor predeterminado: 1209600 (dos semanas, en segundos)

El tiempo de vencimiento de la cookie de sesión, en segundos.

¿SESSION_COOKIE_DOMAIN?

Predeterminado: Ninguno

El dominio de la cookie de sesión. Si desea configurar una cookie entre dominios, puede configurarla en el formato "lawrence.com"; de lo contrario, utilice Ninguna.

¿NOMBRE_COOKIE_SESIÓN?

Valor predeterminado: "id de sesión"

El nombre de la cookie utilizada por la sesión se puede configurar según sea necesario.

SESSION_COOKIE_SECURE?

Valor predeterminado: Falso

Si se utiliza el modo seguro para las cookies de sesión. Si se establece en Verdadero, la cookie se marcará como "segura". En este caso, el navegador debe determinar si la cookie se envió a través de una conexión HTTPS.

SESSION_EXPIRE_AT_Browser_CLOSE?

Valor predeterminado: Falso

Si expira la sesión cuando el usuario cierra el navegador.

Para obtener más información, consulte Sesiones sincronizadas con el navegador y Sesiones persistentes más arriba.

¿Sesión_guardada_por-solicitud?

Valor predeterminado: Falso

Si se guardan los datos de la sesión para cada solicitud. Si es Falso (el valor predeterminado), los datos de la sesión solo se guardarán después de modificarlos, es decir, cuando se asigne o elimine su valor de diccionario.

¿Detalles técnicos?

El diccionario de sesión puede aceptar cualquier objeto Python compatible con pickle. Consulte el módulo de pepinillos para obtener más detalles.

Los datos de la sesión se almacenan en la tabla de la base de datos django_session.

Django sólo envía cookies cuando es necesario. Si no configura ningún dato de sesión, no enviará cookies.

¿ID de sesión en URL?

El marco de sesión de Django se basa completamente en cookies y solo puede basarse en cookies. No coloca el ID de la sesión en la URL como lo hace algún software (como PHP) cuando la sesión no funciona correctamente. Esta decisión se tomó después de una cuidadosa consideración. Ese método no sólo hace que la URL sea fea, sino que también permite que el ID de la sesión se filtre a través del encabezado "Referer", lo que plantea riesgos de seguridad para el sitio web.