为什么当我更新数据后在 Django 中注销时出现此错误?

Why when i logout in django after i updated my data appears this error?

我是 django 的新手,我正在尝试创建一个 Admin 具有 CRUD 功能的应用程序。我的问题是当管理员更新其他用户,然后注销时,注销功能正常工作。但是,当管理员更新 him/her 自我然后管理员注销时,出现此错误

KeyError at /simofa/logout/
'username'
Request Method: GET
Request URL:    http://localhost:8000/simofa/logout/
Django Version: 1.7.4
Exception Type: KeyError
Exception Value:    
'username'
Exception Location: /usr/local/lib/python2.7/dist-packages/django/contrib/sessions/backends/base.py in __delitem__, line 56
Python Executable:  /usr/bin/python
Python Version: 2.7.6
Python Path:    
['/home/boss/kantor/akun',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-i386-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client',
 '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']
Server time:    Tue, 10 Mar 2015 02:24:44 +0000

这是追溯:

Environment:


Request Method: GET
Request URL: http://localhost:8000/simofa/logout/

Django Version: 1.7.4
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'simofa',
 'accounts')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/boss/kantor/akun/simofa/views.py" in logout
  174.     del request.session['username']
File "/usr/local/lib/python2.7/dist-packages/django/contrib/sessions/backends/base.py" in __delitem__
  56.         del self._session[key]

Exception Type: KeyError at /simofa/logout/
Exception Value: 'username'

这是我的观点:(更新并注销)

def update_user(request, pk, template_name='update_user.html'):
    #cek session
    if 'username' in request.session:
        user = get_object_or_404(User, pk=pk) #ambil id dengan get
        profile = UserProfile.objects.filter(user=user).first()
        user_form = UserForm(data=request.POST, instance=user) #gunakan instance untuk mengambil data yang sudah ada
        profile_form = UserProfileForm(data=request.POST, instance=profile) #gunakan instance untuk mengambil data yang sudah ada
        users = User.objects.all()
        if request.POST:
            if user_form.is_valid() and profile_form.is_valid():
                user.set_password(user.password) #hashing
                user.save()
                profile = profile_form.save(commit=False)
                profile.user = user
                profile.save()
                return redirect('manajemen_user')
        else:
            user_form = UserForm(instance=user)
            profile_form = UserProfileForm(instance=profile)

        data = {
                'user_form': user_form,
                'profile_form': profile_form,
                'object_list': users,
        }
        return render(request, template_name, data)
    else:
        return HttpResponseRedirect('/simofa/login')

def logout(request):
    del request.session['username']
    del request.session['password']
    del request.session['hak_akses']
    return HttpResponseRedirect('/simofa/login')

我对这个错误感到困惑,为什么当管理员更新自己然后注销时它不能正常工作?以及如何修复它?

因为我认为我的更新和注销功能没有问题。 我将非常感谢您的投入。所以,请帮助我。非常感谢

当您更改用户密码时,their session is reset。 Django 负责重新注入会话哈希,这样用户就不会自动注销,但是您存储在会话中的值将会消失。

我认为您正试图防止您的注销视图崩溃。在 logout 中,将每一行更改为如下所示:if 'username' in request.session: del request.session['username'](将用户名替换为正确的值)。

您可以执行 request.session.flush(),因此会话数据将被 刷​​新 ,请参阅 logout function 来自 django 身份验证源

def logout(request):
    """
    Removes the authenticated user's ID from the request and flushes their
    session data.
    """
    # Dispatch the signal before the user is logged out so the receivers have a
    # chance to find out *who* logged out.
    user = getattr(request, 'user', None)
    if hasattr(user, 'is_authenticated') and not user.is_authenticated():
        user = None
    user_logged_out.send(sender=user.__class__, request=request, user=user)

    # remember language choice saved to session
    language = request.session.get(LANGUAGE_SESSION_KEY)

    request.session.flush()

    if language is not None:
        request.session[LANGUAGE_SESSION_KEY] = language

    if hasattr(request, 'user'):
        from django.contrib.auth.models import AnonymousUser
        request.user = AnonymousUser()