tutorial permisos example con close django django-models django-sessions

permisos - Django: configurar una sesión y obtener la clave de sesión en la misma vista



permisos con django (2)

Quiero almacenar algunas cosas en una base de datos, y estoy usando la sesión actual como una clave externa: de models.py

class Visited(models.Model): session = models.ForeignKey(Session) page = models.ForeignKey(Page) times_visited = models.PositiveIntegerField() ip_address = models.IPAddressField() date_last_visited = models.DateTimeField() def __unicode__(self): return u''(%s, %s)'' % (str(self.session.session_key), str(self.page.name))

Para hacer una nueva entrada para este modelo, estoy usando lo siguiente para obtener la sesión actual (en views.py):

Session.objects.get(session_key=request.session.session_key)

Sin embargo, si es la primera vez que un usuario visita el sitio y, por lo tanto, aún no tiene un conjunto de cookies, el código anterior generará un error DoesNotExist .


Sé que incluso si ahora hay un conjunto de cookies, todavía puede establecer objetos de sesión. Así que puedo pensar en algunos trucos para hacer que esto funcione, como:

  • Establecer el identificador único como un objeto de sesión (además de la clave de sesión)
  • Almacenar temporalmente los datos que deseo agregar a la base de datos un objeto de sesión, y usar una función decoradora para verificar si existe antes de usar una sesión.
  • Solo use los objetos de sesión y no almacene nada en la base de datos (esto sería técnicamente posible, pero para mi implementación dependería de que los diccionarios de Python, con unos pocos cientos de entradas, sean al menos tan eficientes como una base de datos para cosas como la clasificación).


Pero me gustaría una solución mejor con la que pueda vivir. ¿Hay alguna solución generalmente usada o buena para este problema? ¿O incluso estoy haciendo referencia a las sesiones correctamente en mi modelo?

Gracias por tu ayuda.


Si desea destruir la sesión, sugeriría que una mejor idea es usar primero el shell django.

from django.contrib.sessions.models import Session Session.objects.all() #you see all sessions Session.objects.all().delete()

En la última consulta puedes filtrar según tu necesidad. y haz una consulta


request.session es un objeto SessionStore con una única session_key.

La session_key se crea tan pronto como se accede al atributo. Pero el objeto de sesión en sí solo se guarda en la base de datos después de que la vista se haya procesado (en el método process_response del middleware de sesión) llamando al método de guardar del objeto SessionStore.

No está realmente documentado, pero mirando el código fuente, supongo que se supone que debes crear un nuevo objeto de sesión como este:

if not request.session.exists(request.session.session_key): request.session.create()

También puede crear middleware de sesión personalizado, que asegure que su nuevo objeto de sesión esté siempre disponible antes de que cualquiera de sus vistas intente acceder a él:

from django.conf import settings from django.contrib.sessions.middleware import SessionMiddleware class CustomSessionMiddleware(SessionMiddleware): def process_request(self, request): engine = import_module(settings.SESSION_ENGINE) session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None) request.session = engine.SessionStore(session_key) if not request.session.exists(request.session.session_key): request.session.create()

(Por supuesto, debe hacer referencia a su nuevo middleware de sesión a través del SESSION_ENGINE dentro de su settings.py )

Pero tenga en cuenta que este enfoque generará un nuevo objeto de sesión para cada solicitud si el navegador del usuario no admite cookies ...