Flask应用中跨方法访问变量问题求助
我来帮你捋清楚问题所在,然后给出能正常运行的解决方案~
为什么你的代码无法运行?
Flask是无状态的Web框架,每个请求都是独立的:
original_text_form里的summary是函数内部的局部变量,当这个请求处理完,变量就会被销毁,不会留到下一个请求。- 你写的
x = original_text_form只是拿到了函数的对象,并没有执行函数获取之前生成的summary;就算你调用x(),也会重新触发一次/templates的请求逻辑(还会因为没有表单数据报错),根本拿不到之前的结果。
可行解决方案:用Flask Session跨请求存储数据
Session可以在同一个用户的多个请求之间临时保存数据,刚好适合你这种“生成摘要后再保存”的场景。
步骤1:给Flask应用设置加密密钥
Session数据会被加密存储在用户的Cookie里,所以必须设置一个密钥:
app = Flask(__name__) # 随便写一个复杂的字符串,比如用随机生成的密钥,线上环境要保密! app.secret_key = 'my-super-secret-key-12345-abcdef'
步骤2:在生成摘要的函数里把summary存入Session
修改original_text_form,把生成的摘要存到session中:
from flask import session # 别忘了导入session @app.route('/templates', methods=['POST']) def original_text_form(): title = "Summarizer" text = request.form['input_text'] max_value = sent_tokenize(text) num_sent = int(request.form['num_sentences']) sum1 = summarize() summary = sum1.get_summary(text, num_sent) print(summary) # 把摘要存入session,后续请求就能拿到 session['generated_summary'] = summary return render_template("index.html", title=title, original_text=text, output_summary=summary, num_sentences=len(max_value)) # 这里你之前传的是列表,应该传句子数量更合理
步骤3:在保存函数中从Session取出摘要并写入文件
修改saveToFile,从session中获取之前的摘要:
@app.route('/savetextfile', methods=['POST']) def saveToFile(): # 从session中取出摘要,没有的话返回提示 summary = session.get('generated_summary') if not summary: return render_template("index.html", error_msg="请先生成摘要再尝试保存哦!") # 注意用'w'模式写文本,'wb'是二进制模式,会报错 file_path = '/Users/johnsriskandarajah/Documents/summarizer-master/summary.txt' with open(file_path, 'w', encoding='utf-8') as filehandle: filehandle.write(summary) # 返回保存成功的提示 return render_template("index.html", save_success=True)
其他注意事项
- 如果你的
summary是列表类型(比如句子列表),写入文件前要转成字符串,比如filehandle.write('\n'.join(summary))。 - 如果你不想用Session,也可以在生成摘要后,把
summary作为隐藏表单字段,提交保存请求时一起传递,但这种方式只适合一次性提交的场景,Session更灵活。
内容的提问来源于stack exchange,提问作者j-s
相关产品推荐
相关产品推荐

