Tôi đã viết điều này trong một cái nhìn ajax, nhưng đó là một câu trả lời mở rộng hơn cho danh sách người dùng hiện đang đăng nhập và đăng xuất.
Các is_authenticated
thuộc tính luôn luôn trở lại True
cho người dùng của tôi, mà tôi cho rằng dự kiến vì nó chỉ kiểm tra cho AnonymousUsers, nhưng để chứng minh vô dụng nếu bạn đã nói phát triển ứng dụng trò chuyện, nơi bạn cần phải đăng nhập người dùng hiển thị.
Điều này kiểm tra các phiên hết hạn và sau đó tìm ra người dùng thuộc về họ dựa trên _auth_user_id
thuộc tính được giải mã :
def ajax_find_logged_in_users(request, client_url):
"""
Figure out which users are authenticated in the system or not.
Is a logical way to check if a user has an expired session (i.e. they are not logged in)
:param request:
:param client_url:
:return:
"""
# query non-expired sessions
sessions = Session.objects.filter(expire_date__gte=timezone.now())
user_id_list = []
# build list of user ids from query
for session in sessions:
data = session.get_decoded()
# if the user is authenticated
if data.get('_auth_user_id'):
user_id_list.append(data.get('_auth_user_id'))
# gather the logged in people from the list of pks
logged_in_users = CustomUser.objects.filter(id__in=user_id_list)
list_of_logged_in_users = [{user.id: user.get_name()} for user in logged_in_users]
# Query all logged in staff users based on id list
all_staff_users = CustomUser.objects.filter(is_resident=False, is_active=True, is_superuser=False)
logged_out_users = list()
# for some reason exclude() would not work correctly, so I did this the long way.
for user in all_staff_users:
if user not in logged_in_users:
logged_out_users.append(user)
list_of_logged_out_users = [{user.id: user.get_name()} for user in logged_out_users]
# return the ajax response
data = {
'logged_in_users': list_of_logged_in_users,
'logged_out_users': list_of_logged_out_users,
}
print(data)
return HttpResponse(json.dumps(data))