Flask中用变量作为session键为何显示不符?
Flask会话键名打印问题解决
问题场景
我编写了如下Flask路由处理函数,用于接收页面表单数据并存入session:
@app.route("/process_page_data/<page>", methods=["POST"]) def process_page_data(page): print(f"\n process {page} data... \n") session[f"{page}"] = list(request.form.items()) print(f"\n{session[page]=}") return "Hello World"
终端输出内容:
process page1 data... session[page]=[('q1', '1'), ('q2', '1'), ('q3', '1'), ('q4', '1'), ('q5', '1'), ('q6', '1'), ('q7', '1'), ('q8', '1'), ('q9', '1'), ('q10', '1'), ('q11', '1'), ('q12', '1'), ('q13', '1'), ('q14', '1'), ('q15', '1')]
我期望输出里的会话键显示为session['page1'],但实际显示的是session[page],找不到问题原因。
问题原因
这是Python f-string的特性导致的:{session[page]=}这种写法属于表达式格式化,它会原样输出表达式的结构,仅计算表达式的值。这里的page被当成了表达式的一部分,不会被替换为变量的实际值page1。
解决方案
要让输出显示变量page的实际值作为键名,需要手动将变量插入到输出文本中,修改打印语句即可:
@app.route("/process_page_data/<page>", methods=["POST"]) def process_page_data(page): print(f"\n process {page} data... \n") session[page] = list(request.form.items()) # 可简化f"{page}"为page,效果一致 print(f"\nsession['{page}']={session[page]}") return "Hello World"
修改后的终端输出:
process page1 data... session['page1']=[('q1', '1'), ('q2', '1'), ('q3', '1'), ('q4', '1'), ('q5', '1'), ('q6', '1'), ('q7', '1'), ('q8', '1'), ('q9', '1'), ('q10', '1'), ('q11', '1'), ('q12', '1'), ('q13', '1'), ('q14', '1'), ('q15', '1')]
说明:
- 把
{session[page]=}改为session['{page}']={session[page]},这样{page}会被替换为变量的实际值,同时用单引号包裹,符合期望的格式。 - 存入session时,
session[f"{page}"]可以简化为session[page],因为路由参数page本身就是字符串类型,直接作为键名即可。
内容的提问来源于stack exchange,提问作者Sammyul Haque
相关产品推荐
相关产品推荐

