Как получить список аутентифицируемых пользователей?

Я хотел бы отобразить список аутентифицируемых пользователей.

На документации: http://docs.djangoproject.com/en/dev/topics/auth/

модели класса. Пользователь
is_authenticated () ¶
Всегда возвращает True. Это - способ сказать, аутентифицировался ли пользователь...

Можно знать на шаблонной стороне, текущий Пользователь, аутентифицируется или нет:

{%, если пользовательский is_authenticated %} {% endif %}

Но я не сделал нашел путь получением списка аутентифицируемых пользователей.

Какая-либо идея?

34
задан Bill the Lizard 4 November 2011 в 11:35
поделиться

2 ответа

Следуя ответу rz, вы можете запросить модель Session для сеансов без истекшего срока, а затем преобразовать данные сеанса в пользователей. Получив это, вы можете превратить его в тег шаблона, который может отображать список на любой странице.

(Все это не проверено, но, надеюсь, будет близко к работе).

Получить всех зарегистрированных пользователей ...

from django.contrib.auth.models import User
from django.contrib.sessions.models import Session
from django.utils import timezone

def get_all_logged_in_users():
    # Query all non-expired sessions
    # use timezone.now() instead of datetime.now() in latest versions of Django
    sessions = Session.objects.filter(expire_date__gte=timezone.now())
    uid_list = []

    # Build a list of user ids from that query
    for session in sessions:
        data = session.get_decoded()
        uid_list.append(data.get('_auth_user_id', None))

    # Query all logged in users based on id list
    return User.objects.filter(id__in=uid_list)

Используя это, вы можете создать простой тег шаблона включения ...

from django import template
from wherever import get_all_logged_in_users
register = template.Library()

@register.inclusion_tag('templatetags/logged_in_user_list.html')
def render_logged_in_user_list():
    return { 'users': get_all_logged_in_users() }

logged_in_user_list.html

{% if users %}
<ul class="user-list">
    {% for user in users %}
    <li>{{ user }}</li>
    {% endfor %}
</ul>
{% endif %}

Затем на своей главной странице вы можете просто использовать его там, где вы например ...

{% load your_library_name %}
{% render_logged_in_user_list %}

РЕДАКТИРОВАТЬ

Для тех, кто говорит о 2-недельной постоянной проблеме, я предполагаю, что любой, кто хочет иметь список "активных пользователей", будет использовать SESSION_EXPIRE_AT_BROWSER_CLOSE , хотя я понимаю, что это не всегда так.

68
ответ дан 27 November 2019 в 16:25
поделиться

Я знаю, что нет простого встроенного способа сделать то, что вы хотите. Я бы попробовал комбинацию истекающих сеансов и фильтрации на last_login. Может быть, даже написать для этого кастомный менеджер.

1
ответ дан 27 November 2019 в 16:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: