如何在Django中注销用户?

时间:2014-08-11 20:19:54

标签: python django django-authentication django-sessions

我们的Django部署每晚都会检查哪些活动用户仍然可以在LDAP目录中找到。如果找不到它们,我们将它们设置为不活动状态。如果他们下次尝试登录,则会失败。这是我们的代码:

def synchronize_users_with_ad(sender, **kwargs):
    """Signal listener which synchronises all active users without a usable
    password against the LDAP directory.  If a user cannot be
    found anymore, he or she is set to “inactive”.
    """
    ldap_connection = LDAPConnection()
    for user in User.objects.filter(is_active=True):
        if not user.has_usable_password() and not existing_in_ldap(user):
            user.is_active = user.is_staff = user.is_superuser = False
            user.save()
            user.groups.clear()
            user.user_permissions.clear()

maintain.connect(synchronize_users_with_ad)

但如果他们仍然登录,则此会话仍然有效。我们怎样才能立即使它们无效?会话中间件的所有设置都是默认值。

3 个答案:

答案 0 :(得分:13)

您可以使用

将其注销
from django.contrib.auth import logout

if <your authentication validation logic>:
    logout(request) 

...来自任何视图。

答案 1 :(得分:1)

除了login_required装饰器之外,您还可以使用user_passes_test decorator来测试用户是否仍处于活动状态。

from django.contrib.auth import user_passes_test

def is_user_active(user):
    return user.is_active

@user_passes_test(is_user_active, login_url='/your_login')
def your_function(request):
    ....

答案 2 :(得分:0)

您可以使用会话后端,该后端使您可以查询和获取特定用户的会话。在这些会话后端中,会话具有用户的外键,因此您可以轻松查询会话:

使用这些后端,删除用户的所有会话可以在一行代码中完成:

# log-out a user
user.session_set.all().delete()

免责声明::我是django-qsessions的作者。