Python Django自动注销未在数据库中更新
我正在从事一个使用Python(2.7)和Django(1.11)的项目,在这个项目中,我需要在不活动的情况下实现几分钟或几个小时的自动注销 注意:我搜索了很多相关问题,但找不到解决我具体问题的方法,所以请不要将其标记为重复 通过在Python Django自动注销未在数据库中更新,python,django,python-2.7,django-authentication,django-login,Python,Django,Python 2.7,Django Authentication,Django Login,我正在从事一个使用Python(2.7)和Django(1.11)的项目,在这个项目中,我需要在不活动的情况下实现几分钟或几个小时的自动注销 注意:我搜索了很多相关问题,但找不到解决我具体问题的方法,所以请不要将其标记为重复 通过在settings.py中添加一些设置,我实现了这一点: SESSION_COOKIE_AGE = 120 SESSION_SAVE_EVERY_REQUEST = True LOGOUT_REDIRECT_URL = 'mainlogin' 仅用于测试目的,我已将其
settings.py
中添加一些设置,我实现了这一点:
SESSION_COOKIE_AGE = 120
SESSION_SAVE_EVERY_REQUEST = True
LOGOUT_REDIRECT_URL = 'mainlogin'
仅用于测试目的,我已将其设置为2分钟。
2分钟后,当我刷新页面时,用户将注销并重定向到登录页面,但在后端/数据库中,用户的状态仍为活动
我需要使用活动用户进行进一步的处理/执行,因此,如果用户自动注销,那么它不应该是活动用户,但它是
如果我手动注销该用户,它将不再显示在活动用户中,这意味着手动注销工作正常,但自动注销仍将用户显示为活动用户
以下是我获取活动用户的方法:
all_active_users = user_table.objects.filter(user_type='a', status=1, approval_status=1, is_active=True)
# further execution
更新:我正在为用户使用名为user\u table
的自定义模式,下面是我根据答案建议尝试的内容:
它将空查询集返回为:活动驱动程序是:
即使是driver
类型的用户也已登录
如何克服此问题,以便当用户自动注销时,它不会显示在活动用户中。您误解了。Django使用此字段来确定是否允许用户登录,而不是确定用户当时是否登录 即使您想创建自己的
User
字段来存储此信息,也很难做到,因为会话只会随着时间的推移而过期。服务器上实际上没有发生任何可能触发模型字段更改的事件
因此,如果需要确定所有登录用户,则需要使用会话存储。Django并没有提供一种简单的方法来实现这一点,但它确实是可能的。显示如何查询
会话
表以确定谁已登录。您误解了会话的含义。Django使用此字段来确定是否允许用户登录,而不是确定用户当时是否登录
即使您想创建自己的User
字段来存储此信息,也很难做到,因为会话只会随着时间的推移而过期。服务器上实际上没有发生任何可能触发模型字段更改的事件
因此,如果需要确定所有登录用户,则需要使用会话存储。Django并没有提供一种简单的方法来实现这一点,但它确实是可能的。显示如何查询
会话
表以确定谁已登录。我建议使用自定义会话后端,该后端带有到期/最后一个活动列,可在每次请求时更新,或用于提高性能,一个支持Redis的会话存储,您只需使用Redis的本机到期即可。我建议您使用一个自定义会话后端,该后端具有到期/最后一个活动列,可在每次请求时更新,或者为了提高性能,一个支持Redis的会话存储,您只需使用Redis的本机到期即可。Hi@KevinChristopherHenry,我正在为名为user\u table
的用户使用自定义模型,那么如何在get\u all\u logged\u-in\u-users
的代码中使用自定义模型呢?@AbdulRehman:只需使用user\u table.objects
而不是user.objects
。我也尝试过,因为更新了这个问题,但是当一些用户登录时,它返回一个空的queryset
。现在它在更改数据后工作。get('u auth\u user\u id',None)
到数据。get('user\u id',None)
Hi@KevinChristopherHenry,我正在为名为user\u table
的用户使用一个自定义模型,那么,我如何在中使用自定义模型从您的建议中获取所有登录用户的代码?@AbdulRehman:只需使用用户表.objects
而不是用户.objects
。我也尝试过了,因为更新了问题,但是当一些用户登录时,它返回一个空的queryset
。现在它在更改data.get(“'u auth\u user\u id',None)
到data.get('user\u id',None)
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('id', None))
# Query all logged in users based on id list
return user_table.objects.filter(id__in=uid_list)