2010-06-12 12 views
7

Tengo una aplicación django/apache2 + memcached en ejecución (ubuntu) y me gustaría hacer un seguimiento de los usuarios que están conectados.¿Cuál es la mejor manera de implementar una función de "última vez que se ve" en una aplicación web django?

¿Cuál sería la mejor manera de rastrear esto?

Preferiría no escribir en la base de datos cada vez que un usuario conectado carga una página; pero, ¿qué otras opciones hay?

+0

Entonces, ¿cómo resultó para usted? Me interesaría tu propia solución ... – mawimawi

Respuesta

4

Un enfoque podría ser:

se crea un middleware que hace lo siguiente en process_response:

  • de verificación de una cookie denominada 'en línea', pero sólo si el usuario es autenticado
  • si la cookie no está allí,
    • establecer una cookie llamados 'en línea' con el valor '1'
    • establecer el lifesp una de la cookie a 10 minutos
    • actualización del campo 'last_login' de auth.user para este usuario con la fecha y hora actuales

ahora que ha iniciado sesión actualmente en todos los usuarios de la tabla auth.user . Todos los usuarios que tienen un last_login más nuevo que datetime.now() - interval (15 minutos) pueden considerarse "en línea".

La base de datos se escribirá para cada usuario conectado aproximadamente cada 10 minutos. Ajuste los valores "10" y "15" según sus necesidades.

La ventaja aquí es que las escrituras de la base de datos son raras (de acuerdo con sus dos configuraciones numéricas 10/15). Y para la optimización de velocidad, asegúrese de que last_login esté indexado, por lo que un filtro en este campo, incluido Count, es realmente rápido.

Espero que esto ayude.

+1

Me gusta esta idea, excepto que no actualizaría la autenticación.El campo last_login del usuario. Actualizaría un modelo de perfil de usuario o tal vez otro modelo. ¿Cómo extendería esto a usuarios no autenticados? Supongo que muchos bots no usarían cookies. Es posible que tenga que rastrear a través de la dirección IP de alguna manera. –

1

Un hashmap o una cola en la memoria con una tarea que se ejecuta cada hora para persistir.

0

No puede hacer eso en django sin usar una base de datos/persistent-storage debido a la misma razón por la cual las sesiones django están almacenadas en la base de datos: Puede haber múltiples instancias de sus aplicaciones ejecutándose y debe sincronizar sus estados + datos a través de una sola fuente de persistencia [1]

O bien, puede escribir esta información en una carpeta en un archivo llamado con id de usuario y luego verificar su fecha de creación/modificación para encontrar la información requerida.

+1

Las sesiones de Django no tienen que almacenarse en la base de datos. Se pueden almacenar en la memoria caché. –

1

Necesita persistir la información del lado del servidor, la integridad no es crítica, el rendimiento y la latencia son importantes. Eso significa que deberías usar algún tipo de tienda de clave-valor.

Memcached y redis tienen claves que caducan. Probablemente ya tengas memcached instalado, así que úsalo.

Puede restablecer el tiempo de caducidad de la clave user:last-seen:$username en cada visita, o puede usar la técnica de cookies de mawimawi y tener una caducidad = 4 * cookie-lifetime.

+0

Pero, ¿cómo recuperaría qué usuarios están en línea desde la memoria caché, digamos para mostrarlos en una etiqueta de plantilla? –

+0

Entendí que OP solo quería una bombilla "en línea ahora mismo" en las miniaturas de los usuarios y en las páginas de perfil, y que había demasiados usuarios en línea para mostrar una lista. Otros han respondido con diferentes suposiciones. – Tobu

Cuestiones relacionadas