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
设置,尽管我认识到并非总是这样.
最可靠的解决方案只是您在用户登录或注销时存储的内容.我看到了这个解决方案,我觉得它值得分享.
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)
logged_users = LoggedUser.objects.all().order_by('username')
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19615 次 |
最近记录: |