我正在使用Flask(vsn 0.8)和Flask-WTF(vsn 0.5.2)(例如,解析表单)来创建一个非常简单的网站。但是,我无法让Flask-WTF正确解析我的GET结果。
我的相关代码如下所示:
@app.route("/result", methods=("GET", "POST"))
def submit():
form = MyForm()
print request.args
print request.args.get('aws_id', None, type=str)
print form.is_submitted()
if form.validate_on_submit():
flash('Success')
aws_id = form.aws_id.data
return render_template("index.html", form=form)
如果我使用GET的单个字段'aws_id'提交我的表单,我会在控制台上获得以下输出。
127.0.0.1 - - [19/Oct/2011 22:28:59] "GET /result?aws_id=test_string HTTP/1.1" 200 -
ImmutableMultiDict([('aws_id', u'test_string')])
test_string
False
在我看来,提交工作正常,但Flask-WTF没有做到这一点。从本质上讲,处理表单输出的旧方法有效,即request.args.get方法,但新的form.is_submitted和form.validate_on_submit并没有做到他们的神奇善良。
有什么想法吗? (WTF!)
答案 0 :(得分:2)
我将我的应用移动到了我的网站的根目录,删除了那里的那个(=多余的),并将request.form
添加到MyForm类。这似乎解决了这个问题。还必须将csrf_enabled
设置为false。
@app.route("/", methods=("GET", "POST"))
def submit():
form = MyForm(request.form, csrf_enabled=False)
if form.validate_on_submit():
print form.data
return render_template("index.html", form=form)
答案 1 :(得分:2)
Flask-WTF的Form
类is_submitted
方法如下所示:
def is_submitted(self):
"""
Checks if form has been submitted. The default case is if the HTTP
method is **PUT** or **POST**.
"""
return request and request.method in ("PUT", "POST")
在其__init__
中有这段代码,通常可以确保从Flask请求中自动加载formdata:
if formdata is _Auto:
if self.is_submitted():
formdata = request.form
所以很清楚......如果你通过GET提交表单,你就不会得到任何好的自动行为。这是可以理解的,因为如果它是GET请求,则不清楚表单是否已提交或您是否只是加载页面。这不是任何CSRF问题。
validate_on_submit
也不起作用,因为它还依赖于is_submitted
Flask本身也不会将GET字段解析为request.form
。
您最终必须执行以下操作:
form = MyForm(request.args, csrf_enabled=False)
if 'aws_id' in request.args and form.validate():
flash('Success')
aws_id = form.aws_id.data
(假设您的MyForm
类继承自from flask.ext.wtf import Form
)