在Django中使用request.session时遭遇KeyError错误求助
让我帮你一步步排查这个KeyError问题,看起来主要有几个可能的原因,咱们逐个分析并给出修复方案:
1. 直接访问/addfixeddeposit/导致Session键不存在
你当前的addfixeddeposit视图直接用request.session['account_number']取值,但如果用户跳过anotherpage视图(也就是没经过设置session的步骤),直接输入/addfixeddeposit/路径,session里根本没有account_number这个键,自然会抛出KeyError。
修复方法:用session的get()方法安全获取值,同时增加判断逻辑:
def addfixeddeposit(request): if request.method == "POST": # 安全获取session值,不存在则返回None var = request.session.get('account_number') if not var: # 没有session值时,重定向到需要选择账户的页面(请根据你的路由调整参数) return redirect('your_account_selection_page') print(var) form = FixedDepositForm(request.POST) # 注意:form.is_valid是方法,必须加()调用! if form.is_valid(): acc = Account.objects.get(pk=var) tenure = request.POST['tenure'] # 这里有拼写错误:reuquest → request rate = request.POST['rate'] new_fixed = FixedDeposit(account_number=acc, tenure=tenure, rate=rate) new_fixed.save() del request.session['account_number'] return redirect('behome') return redirect('behome')
2. 代码里的隐性拼写错误
你的addfixeddeposit视图里有个明显的拼写错误:reuquest.POST['rate'] → 应该是request.POST['rate'],这个错误会导致程序运行到该行时抛出NameError,虽然不是直接引发KeyError,但也是必须修复的bug。
另外,form.is_valid这里漏了括号,应该写成form.is_valid()——否则这个判断永远为True(因为你在判断方法对象是否存在,而不是调用方法验证表单)。
3. Session过期或意外清除
如果用户在anotherpage页面停留时间过长,session可能会过期;或者用户手动清除了浏览器cookie(Django的session默认存储在cookie中),也会导致account_number丢失,触发KeyError。
修复方法:同样用get()方法处理,并且在获取不到值时引导用户回到正确的流程页面,比如重定向到账户选择页。
额外优化建议:表单数据获取更安全
既然你已经使用了FixedDepositForm,可以直接从表单的cleaned_data中获取验证后的数据,不用手动从request.POST取值,这样能避免很多潜在问题:
if form.is_valid(): acc = Account.objects.get(pk=var) # 从表单的cleaned_data获取经过验证的数据 tenure = form.cleaned_data['tenure'] rate = form.cleaned_data['rate'] new_fixed = FixedDeposit(account_number=acc, tenure=tenure, rate=rate) new_fixed.save()
内容的提问来源于stack exchange,提问作者Abhinav Kushagra

