django python-2.7 django-sessions

django - Cómo borrar todas las variables de sesión sin cerrar sesión



python-2.7 django-sessions (6)

A partir de Django 1.8, cualquier llamada a flush() cerrará la sesión del usuario. De los docs :

Cambiado en Django 1.8: la eliminación de la cookie de sesión es un comportamiento nuevo en Django 1.8. Anteriormente, el comportamiento era volver a generar el valor de la clave de sesión que se envió al usuario en la cookie.

Si desea poder eliminar las claves pero mantener al usuario conectado, deberá manejarlo manualmente:

for key in request.session.keys(): del request.session[key]

O simplemente elimine las claves específicas que son de interés:

del request.session[''mykey'']

Estoy intentando borrar todas las variables de la sesión pero no cerrar la sesión del usuario actual.

user = request.session.get(''member_id'', None) request.session.flush() request.session.modified = True request.session[''member_id''] = user request.session.modified = True

¿Esto también afectará a otros usuarios del sitio?


Como mejora al shacker''s 1 en Python 2.x, dict.keys() devuelve una copia de la lista de las claves de un diccionario, en Python 3.x devuelve un iterador. Cambiar el tamaño de un iterador es imprudente. Para una versión segura de la implementación, la conversión a la lista evitará problemas de tamaño.

for key in list(request.session.keys()): del request.session[key]

Mi respuesta anterior sugirió el uso de dict.viewkeys() pero también devolverá un iterador en Python 3.x.


En las versiones de django <1.8, session.flush borra los datos de la sesión y regenera la clave de la sesión. No afectará a otros usuarios ya que las claves de sesión son únicas.


Puede borrar las claves que ha establecido en la sesión de django, pero hacerlo sin cerrar la sesión del usuario requiere un poco de dificultad; request.session.flush() cierra la sesión del usuario. Y request.session = {} al eliminar todas las claves en el diccionario de sesión también se desconectará al usuario.

Por lo tanto, para borrar las claves sin cerrar la sesión del usuario, debe evitar las claves que comienzan con un carácter de subrayado. El siguiente código hace el truco:

for key in list(request.session.keys()): if not key.startswith("_"): # skip keys set by the django system del request.session[key]


request.session utiliza cookies internamente. Y cuando un usuario solicita alguna URL del sitio, solo las cookies presentes en la máquina de ese usuario se envían al servidor. Por lo tanto, request.session siempre está vinculado al usuario actual.

Por lo tanto, esto de ninguna manera afectará a otros usuarios del sitio.

Además, esto no cerrará la sesión del usuario actual, porque está utilizando flush() lo que eliminará la sesión anterior y creará una nueva sesión, y esta nueva sesión se asociará con el usuario actual.

flush() utiliza internamente clear() , delete() y create() .

En la respuesta, la clave de esta nueva sesión se enviará como una cookie y, en las solicitudes posteriores, esta nueva sesión continuará funcionando normalmente.


session_keys = list(request.session.keys()) for key in session_keys: del request.session[key]