Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django自动注销未在数据库中更新_Python_Django_Python 2.7_Django Authentication_Django Login - Fatal编程技术网

Python Django自动注销未在数据库中更新

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' 仅用于测试目的,我已将其

我正在从事一个使用Python(2.7)和Django(1.11)的项目,在这个项目中,我需要在不活动的情况下实现几分钟或几个小时的自动注销

注意:我搜索了很多相关问题,但找不到解决我具体问题的方法,所以请不要将其标记为重复

通过在
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)