Flask WTForms 表单不验证
Flask WTForms form does not validate
我无法获得某个简单的 Flask WTForm 来验证。
折腾了几天,能想到的都试过了。一般来说,我是 Flask 和 Web 编程的新手。
这是我的代码的一个精简但有效的版本。测试代码的唯一操作(除了提交表单)是将消息打印到终端。 运行时出现:
这是views.py:
# -*- coding: utf_8 -*-
...
@app.route('/test/new/', methods=['GET','POST'])
def newTest():
form = TestForm(request.form)
if form:
print 'request.form.get(\'name\') is %s' % (request.form.get('name'),)
if request.method == 'POST':
print 'in newTest(), request is POST'
if form.validate():
print 'form validates'
return redirect(url_for('allTests'))
else:
print 'form does not validate'
return render_template('newTest.html', form=form)
else:
return render_template('newTest.html', form=form)
这是forms.py:
class TestForm(Form):
name = StringField(u"Test Name", [validators.InputRequired()])
address = StringField(u"Test Address", [validators.InputRequired()])
submit = SubmitField(u"Submit")
models.py:
from sqlalchemy import Column, Integer, Unicode
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class TestModel(Base):
__tablename__ = 'test'
name = Column(Unicode(80), nullable = False)
id = Column(Integer, primary_key = True)
address = Column(Unicode(80), nullable = False)
和模板:
<html lang="en">
<head>
<meta charset="utf-8">
<title>New Test</title>
</head>
<body>
<div>
<form action="{{ url_for('newTest') }}" method="POST" name="add_rest">
<ul>
<li>Name: {{ form.name }}</li>
<li>Address: {{ form.address }}</li>
</ul>
<input type="submit" value="Create">
</div>
</body>
</html>
当我点击上面的 "Create" 时得到的输出(到终端):
request.form.get('name') is Vinnie
in newTest(), request is POST
form does not validate
10.0.2.2 - - [18/Feb/2016 02:34:51] "POST /test/new/ HTTP/1.1" 200 -
然后浏览器会重新显示表单及其内容。
我想我遗漏了一些简单的东西,但我一直无法弄清楚这一点。
代码的结构,如"tree"所示,是:
如果有任何帮助,我将不胜感激!
您是否尝试过在 HTML 文件中插入 CSRF 令牌?
例如,将以下内容添加到您的 Jinja 模板?
<body>
<div>
<form action="{{ url_for('newTest') }}" method="POST" name="add_rest">
<!-- Added line -->
{{ form.csrf_token }}
<ul>
<li>Name: {{ form.name }}</li>
<li>Address: {{ form.address }}</li>
</ul>
<input type="submit" value="Create">
</div>
</body>
This SO post 可能有用。
您还可以查看官方文档here,其中表明validate()
功能需要使用CSRF令牌。
我无法获得某个简单的 Flask WTForm 来验证。
折腾了几天,能想到的都试过了。一般来说,我是 Flask 和 Web 编程的新手。
这是我的代码的一个精简但有效的版本。测试代码的唯一操作(除了提交表单)是将消息打印到终端。 运行时出现:
这是views.py:
# -*- coding: utf_8 -*-
...
@app.route('/test/new/', methods=['GET','POST'])
def newTest():
form = TestForm(request.form)
if form:
print 'request.form.get(\'name\') is %s' % (request.form.get('name'),)
if request.method == 'POST':
print 'in newTest(), request is POST'
if form.validate():
print 'form validates'
return redirect(url_for('allTests'))
else:
print 'form does not validate'
return render_template('newTest.html', form=form)
else:
return render_template('newTest.html', form=form)
这是forms.py:
class TestForm(Form):
name = StringField(u"Test Name", [validators.InputRequired()])
address = StringField(u"Test Address", [validators.InputRequired()])
submit = SubmitField(u"Submit")
models.py:
from sqlalchemy import Column, Integer, Unicode
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class TestModel(Base):
__tablename__ = 'test'
name = Column(Unicode(80), nullable = False)
id = Column(Integer, primary_key = True)
address = Column(Unicode(80), nullable = False)
和模板:
<html lang="en">
<head>
<meta charset="utf-8">
<title>New Test</title>
</head>
<body>
<div>
<form action="{{ url_for('newTest') }}" method="POST" name="add_rest">
<ul>
<li>Name: {{ form.name }}</li>
<li>Address: {{ form.address }}</li>
</ul>
<input type="submit" value="Create">
</div>
</body>
</html>
当我点击上面的 "Create" 时得到的输出(到终端):
request.form.get('name') is Vinnie
in newTest(), request is POST
form does not validate
10.0.2.2 - - [18/Feb/2016 02:34:51] "POST /test/new/ HTTP/1.1" 200 -
然后浏览器会重新显示表单及其内容。
我想我遗漏了一些简单的东西,但我一直无法弄清楚这一点。
代码的结构,如"tree"所示,是:
如果有任何帮助,我将不胜感激!
您是否尝试过在 HTML 文件中插入 CSRF 令牌?
例如,将以下内容添加到您的 Jinja 模板?
<body>
<div>
<form action="{{ url_for('newTest') }}" method="POST" name="add_rest">
<!-- Added line -->
{{ form.csrf_token }}
<ul>
<li>Name: {{ form.name }}</li>
<li>Address: {{ form.address }}</li>
</ul>
<input type="submit" value="Create">
</div>
</body>
This SO post 可能有用。
您还可以查看官方文档here,其中表明validate()
功能需要使用CSRF令牌。