首页 文章

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

提问于
浏览
2

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

  • 6

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

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

  • 1

    你说错了 logout .

    from django.contrib.auth import logout
    

    应该

    from django.contrib.auth.views import logout
    
  • 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'),
    
  • 0

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

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

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

相关问题