bootstrap - ¿Cómo verificar si un usuario está en línea en la plantilla django?
django templates bootstrap (4)
Puede tener un campo entero para cada usuario que indique la cantidad de sesiones que el usuario ha iniciado sesión actualmente. Puede aumentar eso en 1 cada vez que el usuario inicie sesión en algún lugar, y reducirlo en 1 cuando el usuario cierre la sesión en alguna parte.
{% if topic.creator.login_count %}
Online
{% else %}
Offline
{% endif %}
Esta es una forma simple de resolver este problema. Puede actualizar estos datos a través de una solicitud ajax periódicamente.
En plantilla, cuando uso
{% if topic.creator.is_authenticated %}
Online
{% else %}
Offline
{% endif %}
los usuarios siempre están en línea, incluso cuando se han desconectado hace un tiempo. ¿Entonces me pregunto cómo verificar correctamente a los usuarios en línea?
Sí lo hace. Pero la forma correcta de verificar si un usuario está conectado o no es usar: request.user.is_authenticated. Esto devolverá True si la persona está conectada de otra manera False.
p.ej:
en la plantilla:
{% if request.user.is_authenticated ==True %}
do something awesome.
en vistas, pase la solicitud a la plantilla.
return render(''url/filename.html'',{''any variable name'':request})
Gracias a esta excelente publicación de blog, con ligeras modificaciones, se me ocurrió una solución mejor, que utiliza Memcache, por lo tanto, menos retraso por solicitud:
en models.py agregar:
from django.core.cache import cache
import datetime
from myproject import settings
y agregue estos métodos a la clase de perfil de usuario:
def last_seen(self):
return cache.get(''seen_%s'' % self.user.username)
def online(self):
if self.last_seen():
now = datetime.datetime.now()
if now > self.last_seen() + datetime.timedelta(
seconds=settings.USER_ONLINE_TIMEOUT):
return False
else:
return True
else:
return False
en la carpeta userprofile agrega esto middleware.py
import datetime
from django.core.cache import cache
from django.conf import settings
class ActiveUserMiddleware:
def process_request(self, request):
current_user = request.user
if request.user.is_authenticated():
now = datetime.datetime.now()
cache.set(''seen_%s'' % (current_user.username), now,
settings.USER_LASTSEEN_TIMEOUT)
en settings.py agregue ''userprofile.middleware.ActiveUserMiddleware'',
a MIDDLEWARE_CLASSES
y también agregue:
CACHES = {
''default'': {
''BACKEND'': ''django.core.cache.backends.memcached.MemcachedCache'',
''LOCATION'': ''127.0.0.1:11211'',
}
}
# Number of seconds of inactivity before a user is marked offline
USER_ONLINE_TIMEOUT = 300
# Number of seconds that we will keep track of inactive users for before
# their last seen is removed from the cache
USER_LASTSEEN_TIMEOUT = 60 * 60 * 24 * 7
y en profile.html:
<table>
<tr><th>Last Seen</th><td>{% if profile.last_seen %}{{ profile.last_seen|timesince }}{% else %}awhile{% endif %} ago</td></tr>
<tr><th>Online</th><td>{{ profile.online }}</td></tr>
</table>
¡Eso es!
Para probar el caché en la consola, para asegurarse de que Memcache funciona bien:
$memcached -vv
$ python manage.py shell
>>> from django.core.cache import cache
>>> cache.set("foo", "bar")
>>> cache.get("foo")
''bar''
>>> cache.set("foo", "zaq")
>>> cache.get("foo")
''zaq''
La razón por la cual un usuario parece estar siempre en línea se describe en la documentación de Django :
is_authenticated()
- Siempre devuelve
True
... Esta es una forma de saber si el usuario ha sido autenticado. Esto no implica ningún permiso, y no verifica si el usuario está activo o tiene una sesión válida.
Hay varias formas de lograr esto, pero ninguna es "incorporada".
Esta pregunta cubre el último tiempo de actividad de un usuario , y puede usarlo para verificar si un usuario estuvo activo en los últimos minutos.
Alternativamente, puede consultar la tabla de Sesión para verificar si el usuario tiene una sesión activa, pero esto puede ser inexacto si tiene tiempos de espera de sesión largos.