表单提交后如何在重定向时传递输入且不暴露为GET参数?
问题原因与解决办法
异常原因
你调用render_template时用了点.分隔路径(foo.validate_form),但Flask中模板路径的子目录分隔符是斜杠/,这会导致Flask去查找名为foo.validate_form.html的文件,而你的实际文件是templates/foo/validate_form.html,所以触发TemplateNotFound异常。
解决办法
1. 修正模板路径
把render_template的路径参数改成斜杠分隔的格式:
return render_template('foo/validate_form.html', form_validation_list=form_validation_list) # 或者省略.html后缀(Flask会自动补全) return render_template('foo/validate_form', form_validation_list=form_validation_list)
2. 保持数据不暴露的正确姿势
你当前用render_template直接传递form_validation_list的方式是合理的:数据在服务器内部传递到模板,不会出现在URL中,完全避免了GET参数暴露的问题。
3. 可选优化:应对表单重复提交
如果担心用户刷新验证页面导致重复处理表单,可以结合session暂存数据后跳转:
from flask import session, redirect, url_for if request.method == 'POST': form_validation_list = [] for key in request.form: processed_field = process_somehow(request, key) form_validation_list.append(processed_field) # 将数据存入session,默认是加密存储在Cookie中 session['form_validation_list'] = form_validation_list # 跳转到验证页面的视图函数 return redirect(url_for('foo.validate_form'))
然后在验证页面的视图函数中取出数据:
def validate_form(): # 取出数据并从session移除,避免重复使用 form_validation_list = session.pop('form_validation_list', []) return render_template('foo/validate_form.html', form_validation_list=form_validation_list)
注意:session存储的数据不能过大,若数据量较大,建议改用服务器端存储(如Redis)。
内容的提问来源于stack exchange,提问作者Frank Harris
相关产品推荐
相关产品推荐

