我正在使用Django,Django REST框架,Django-rest-auth和Django-allauth编写服务器应用程序。我有一个用于在用户之间传递消息的方法,这应该只在接收者登录时发生。
但是,即使用户已注销(称为is_authenticated()
,而该应用又应调用Django的注销),似乎用户对象的rest-auth/logout/
方法返回True。什么可能导致这个?我有什么想念的吗?
这是我的代码:
class SendMessage(generics.CreateAPIView):
permission_classes = (permissions.IsAuthenticated,)
serializer_class = MessageSerializer
def perform_create(self, serializer):
m = self.request.data['msg']
targetUser = User.objects.get(pk = self.request.data['user'])
if targetUser.is_authenticated():
# Send message
else:
# Don't send message
答案 0 :(得分:4)
不幸的是,is_authenticated()方法总是返回true。
def is_authenticated(self):
"""
Always return True. This is a way to tell if the user has been
authenticated in templates.
"""
return True
用于识别User实例和AnonymousUser实例,这是用户在未通过身份验证时设置的内容。
答案 1 :(得分:1)
尝试获取所有经过身份验证的用户,然后检查目标用户是否在其中:
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_ids():
# 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))
return uid_list
class SendMessage(generics.CreateAPIView):
permission_classes = (permissions.IsAuthenticated,)
serializer_class = MessageSerializer
def perform_create(self, serializer):
m = self.request.data['msg']
if (self.request.data['user'] in get_all_logged_in_users_ids()):
# Send message
else:
# Don't send message
答案 2 :(得分:0)
你误解了is_authenticated
正在检查的内容。
请记住,网络是无状态环境。没有服务器级别的“登录”状态:用户是否登录的唯一记录是该用户的计算机上是否存在cookie。
由于用户始终可以在不通知服务器的情况下关闭浏览器或关闭机器,因此没有可靠的方法来确定用户是否确实已登录。唯一可以接近的方法这是每隔几秒钟进行一次重复的Ajax调用,发布到用当前时间更新用户记录的视图。然后,您可以检查用户确实在最近几秒内确实更新了。但这并不完全可靠。
或者,您可以考虑使用某种长轮询系统来保持频道开放。