如何使用自定义用户模型和自定义注销视图从Django注销?

2024-05-13 10:02:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我制作了一个应用程序并扩展了AbstractUser以向我的User模型添加一些字段。之后,一切都按预期进行(登录、创建用户、重置密码…),但当我尝试使用默认值注销时 django.contrib.auth.LogoutViewinclude('django.contrib.auth.urls') 它将忽略注销。当我回到受限页面时,我可以输入并查看内容,我的用户实际上已经登录

我创建了一个自定义注销视图,如下所示

def custom_logout(request):
    print('Loggin out {}'.format(request.user))
    auth.logout(request)
    print(request.user)
    return HttpResponseRedirect('/restrictedpage')

在restrictedpage上,我有一个打印语句向用户显示

print("User logged: {}".format(request.user))

单击“注销”时,控制台中会显示以下内容:

"GET /restrictedpage  HTTP/1.1" 200 19820
User logged: ceterre
 ----- This is where i click logout ------
Loggin out AnonymousUser
AnonymousUser
"GET /accounts/logout/ HTTP/1.1" 302 0  ----- this redirects me to /restrictedpage
User logged: ceterre
"GET /restrictedpage HTTP/1.1" 200 19820

这从字面上解释为:

 - I know ceterre is logged
 - logging out ceterre
 - user logged: AnonymousUser
 - redirect to restricted page (where I should have no access since im supposedly logged out)
 - user logged: ceterre (without any login or anything...)

Tags: django用户authhttpgetrequestoutlogout
3条回答
from django.contrib.auth import logout

def custom_logout(request):
    print('Loggin out {}'.format(request.user))
    logout(request)
    print(request.user)
    return HttpResponseRedirect('/restrictedpage')

这对我有用,对你也应该有用

登录和注销是Django(也是AbstractUser)的一部分,所以您不需要扩展这部分代码。您必须做的一件事是在settings.py文件中添加以下两行代码:

LOGIN_REDIRECT_URL = 'template_name'
LOGOUT_REDIRECT_URL = 'template_name'

这里有一个适用于Django 3+的解决方案

my_admin模块替换django.contrib.admin

INSTALLED_APPS = [
        ...
        'my_admin.apps.AdminConfig',
        # 'django.contrib.admin',
        ...
]

AdminConfig(my_admin/apps.py):

from django.contrib.admin.apps import AdminConfig as ContribAdminConfig

class AdminConfig(ContribAdminConfig):
    default_site = 'my_admin.admin_site.AdminSite'

AdminSite(my_admin/admin_site.py):

from django.contrib.admin import AdminSite as ContribAdminSite
from django.views.decorators.cache import never_cache

class AdminSite(ContribAdminSite):
    @never_cache
    def logout(self, request, extra_context=None):
        """
        Define your custom logout functionality here.
        Checkout the super logout method to get a baseline implementation.
        
        Log out the user for the given HttpRequest.
        This should *not* assume the user is already logged in.
        """

        # Your logout code here.

        return super().logout(request, extra_context)

相关问题 更多 >