在 Django 中使用 request.session['value'] 时出现 KeyError

Getting KeyError when using request.session['value'] in django

我正在尝试编写会话并想从 django 中的另一个视图函数读取会话。我正在使用 Django 3.1.5。 这是我的 views.py 代码,我在用户登录后设置了一个会话 request.session['value'] = 'istiak'

def loginPage(request):
    if request.user.is_authenticated:
        return redirect('home')
    
    else:
        if request.method == 'POST':
            username = request.POST.get('username')
            password =request.POST.get('password')          
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                request.session['value'] = 'istiak'
                return redirect('home')
            else:
                messages.info(request, 'Username OR password is incorrect')
        context = {}    
    return render(request, 'library_site/login.html')

并且在这个视图中我试图获取这个会话数据。代码->usern = request.session['value']

def bookprofile(request):
    usern = request.session['value']    
    return render(request, 'library_site/bookprofile.html')

但我收到错误 KeyError: 'value'。这里是完整的错误

Traceback (most recent call last):
  File "C:\python\Python38\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\python\Python38\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "B:\django\Django_Project\Library\library\library_site\views.py", line 31, in bookprofile
    usern = request.session['value']
  File "C:\python\Python38\lib\site-packages\django\contrib\sessions\backends\base.py", line 65, in __getitem__
    return self._session[key]
KeyError: 'value'

您收到该错误是因为您访问了 session 中不存在的密钥。

您可能需要考虑对您的代码进行一些修改:

  1. if user is not None 在您的登录视图中将始终是 True,它只会 return 和 AnonymousUser.
  2. 您似乎可以访问 bookprofile 视图,而无需登录或之前设置 session['value'] 值。您可以通过将 session['value'] 替换为 session.get('value', 'defaultValueHere') 来为其设置默认值。另一种选择是在未登录时限制访问 bookprofile 视图。您可以通过在视图上添加装饰器 @login_required 来实现此目的:
from django.contrib.auth.decorators import login_required

@login_required
def bookprofile(request):
  usern = request.session['value']    
  return render(request, 'library_site/bookprofile.html')