在Django中向logout视图添加代码的正确方法

我用另一个函数包装 django.contrib.auth.views.logout 来添加其他行为 . 这是我的新logout_page:

views.py

from django.contrib.auth import logout
def logout_page(request, *args, **kwargs):
    from django.utils import timezone
    user = request.user
    profile = user.get_profile()
    profile.last_logout = timezone.now()
    profile.save()
    logout(request, *args, **kwargs)

urls.py

(r'^logout/$', 'main.views.logout_page', {'next_page': '/'})

但是我收到以下错误:

logout() got an unexpected keyword argument 'next_page'

当logout包含** kwargs时,我不确定为什么'next_page'是一个意外的参数,据我所知,从django.contrib.auth注销应该包含这样的参数 . 从来源:

https://github.com/django/django/blob/master/django/contrib/auth/views.py

def logout(request, next_page=None,
           template_name='registration/logged_out.html',
           redirect_field_name=REDIRECT_FIELD_NAME,
           current_app=None, extra_context=None):
...

我怎么解决这个问题?

回答(4)

2 years ago

你说错了 logout .

from django.contrib.auth import logout

应该

from django.contrib.auth.views import logout

2 years ago

您应该从视图 from django.contrib.auth.views import logout 导入注销,而不是 from django.contrib.auth import logout .

另外,对于此类行为,您可能需要使用注销信号 . 参考login logout signals

2 years ago

我遇到了和你一样的问题并使用了这个简单的解决方法:

views.py:

def my_logout(request):
    # Staff you want to do before logout
    from django.http import HttpResponseRedirect
    return HttpResponseRedirect("/logout2/")

urls.py:

(r'^logout/$', 'views.my_logout'),
url(r'^logout2/$',
    django.contrib.auth.views.logout,
    {'template_name': 'logged_out.html'},  # Next page
    name='auth_logout'),

2 years ago

这已经成为Django V2的一个问题 . 您可以在视图中定义登录和注销功能,并在URL中调用它们 . 或者您可以按照Django文档中给出的示例进行操作

从django.contrib.auth导入视图作为auth_views

path('accounts / login /',auth_views.LoginView.as_view()),