Django会话异常:访问/task/路径时出现'tasK' KeyError求助
排查Django会话KeyError: 'tasK'的问题及解决方案
问题原因分析
- Session键存在性判断逻辑错误:
show_task函数里的if "tasK" != request.session:是完全错误的写法——你本意是检查"tasK"是否不在session中,但这里是把字符串和整个session对象做比较,永远返回True。更关键的是,如果用户先访问的是提交任务的show视图,直接提交POST请求时,show函数里没有初始化"tasK"键,就会直接触发KeyError。 - 提交任务时未初始化Session键:
show函数处理POST请求时,直接调用request.session["tasK"].append(task),如果session中还没有"tasK"这个键,就会抛出KeyError。 - 配置语句无效:
SESSION_COOKIE_SECURE != DEBUG是无效的表达式,不是赋值语句,起不到根据DEBUG状态动态设置SESSION_COOKIE_SECURE的作用。
解决方案
1. 修正Session键存在性判断逻辑
修改show_task函数里的判断逻辑,正确检查"tasK"是否在session中:
def show_task(request): if "tasK" not in request.session: request.session["tasK"] = [] return render(request, "hi/j.html", {"tasK": request.session["tasK"]})
2. 在提交任务前初始化Session键
在show函数处理POST请求前,先确保"tasK"键存在于session中:
def show(request): if request.method == "POST": # 先初始化session键,避免KeyError if "tasK" not in request.session: request.session["tasK"] = [] form = TaskForm(request.POST) if form.is_valid(): task = form.cleaned_data["input"] request.session["tasK"].append(task) request.session.modified = True # 标记session已修改,确保Django保存 else: return render(request, "hi/j.html", {"form": form}) return render(request, "hi/k.html", {"forms": TaskForm()})
注:Django默认会自动保存session的修改,除非你配置了
SESSION_SAVE_EVERY_REQUEST=False,所以手动调用request.session.save()不是必需的。
3. 修正Session配置
把无效的配置语句改成正确的赋值:
SESSION_COOKIE_SECURE = not DEBUG
这样开发环境(DEBUG=True)下SESSION_COOKIE_SECURE为False,生产环境(DEBUG=False)下为True,符合安全规范。
内容的提问来源于stack exchange,提问作者ayan kulber
相关产品推荐
相关产品推荐

