如何获取经过身份验证的用户列表?

GeR*_*art 34 authentication django

我想显示经过身份验证的用户列表.

在文档:http://docs.djangoproject.com/en/dev/topics/auth/

class models.User
is_authenticated()
总是返回True.这是一种判断用户是否已通过身份验证的方法....

您可以在模板方面知道当前用户是否经过身份验证:

{%if user.is_authenticated%} {%endif%}

但我没有找到获取经过身份验证的用户列表的方式.

任何的想法?

T. *_*one 68

与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)
Run Code Online (Sandbox Code Playgroud)

使用它,您可以创建一个简单的包含模板标记...

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() }
Run Code Online (Sandbox Code Playgroud)

logged_in_user_list.html

{% if users %}
<ul class="user-list">
    {% for user in users %}
    <li>{{ user }}</li>
    {% endfor %}
</ul>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

然后在您的主页面中,您可以在您喜欢的地方使用它...

{% load your_library_name %}
{% render_logged_in_user_list %}
Run Code Online (Sandbox Code Playgroud)

编辑

对于那些谈论2周持续性问题的人,我假设任何想要拥有"活跃用户"类型的列表的人都将使用该SESSION_EXPIRE_AT_BROWSER_CLOSE设置,尽管我认识到并非总是这样.


A.J*_*.J. 7

最可靠的解决方案只是您在用户登录或注销时存储的内容.我看到了这个解决方案,我觉得它值得分享.

models.py

class LoggedUser(models.Model):
    user = models.ForeignKey(User, primary_key=True)

    def __unicode__(self):
        return self.user.username

    def login_user(sender, request, user, **kwargs):
        LoggedUser(user=user).save()

    def logout_user(sender, request, user, **kwargs):
        try:
            u = LoggedUser.objects.get(user=user)
            u.delete()
        except LoggedUser.DoesNotExist:
            pass

    user_logged_in.connect(login_user)
    user_logged_out.connect(logout_user)
Run Code Online (Sandbox Code Playgroud)

views.py

logged_users = LoggedUser.objects.all().order_by('username')
Run Code Online (Sandbox Code Playgroud)

  • 我复制粘贴了您的代码,它的效果很好,甚至比接受的答案还要好,因为在某些情况下,当用户注销时未检测到它(但我已经修改了User类)。关于您的解决方案,要获得真正的logging_users,我必须要做:`logged_users = [LoggedUser.objects.all()中用户的user.user”` (2认同)