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

时间:2012-08-05 05:12:00

标签: django login

我用另一个函数包装了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'

我不确定为什么' next_page'当logout包含** kwargs时,一个意外的参数,据我所知,从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 个答案:

答案 0 :(得分:7)

你说的是错误的logout

from django.contrib.auth import logout

应该是

from django.contrib.auth.views import logout

答案 1 :(得分:1)

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

侧面注意,对于此类行为,您可能需要使用注销信号。请参阅login logout signals

答案 2 :(得分:0)

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

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'),

答案 3 :(得分:0)

这已成为Django V2的问题。您可以在视图中定义登录和注销功能,然后在URL中调用它们。或者,您可以按照Django文档

中给出的示例进行操作

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

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