【问题标题】:Getting KeyError when using request.session['value'] in django在 django 中使用 request.session['value'] 时出现 KeyError
【发布时间】:2021-07-17 02:02:11
【问题描述】:

我正在尝试编写会话并想从 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'

【问题讨论】:

  • 您是否启用了SessionMiddleware
  • 我必须指出if user is not None 永远是True。用户只是匿名的。你可能想测试if user.is_autenticated

标签: python django django-models django-views django-sessions


【解决方案1】:

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

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

  1. 您登录视图中的if user is not None 将始终为True,它只会返回AnonymousUser
  2. 您似乎无需登录或之前设置session['value'] 值即可访问bookprofile 视图。您可以通过将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')

【讨论】:

  • 是的。我按照你的指示解决了。非常感谢。
  • 请将此问题标记为正确以关闭该主题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 2021-02-18
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
相关资源
最近更新 更多