为什么验证不适用于表单请求?

Why validation not working on form request?

正在学习flask,做了一个小应用。现在我正在努力学习form。我使用了一个简单的代码来验证 name 请求,当 field 仍然为空时它应该会出错。但它不给一个。

主文件:

from flask import Flask, render_template
from flask.ext.moment import Moment
from flask.ext.wtf import Form
from wtforms import StringField, SubmitField, validators

import requests
import json
from datetime import datetime

app = Flask(__name__)
app.config['SECRET_KEY'] = 'abcd'
moment = Moment(app)


class Nameform(Form):
    name = StringField("whats your name?", [validators.Required()])
    submit = SubmitField('submit')


@app.route('/')
@app.route('/index')
def index():

    api_call = requests.get('https://api.stackexchange.com/2.2/users/moderators?order=desc&sort=reputation&site=Whosebug')  # api call to stack for user with highest scores in des order

    var_1 = json.loads(api_call.text)

    var_2 = [{'link': value['link'], 'name': value['display_name'], 'user_id': value['user_id']} for value in var_1['items']]

    return render_template('index.html', posts=var_2, current_time=datetime.utcnow())


@app.route('/user/<id>/<user_name>')
def user(id, user_name):
    print id
    api_call = requests.get('https://api.stackexchange.com//2.2/users/'+id+'/reputation?site=Whosebug')  # api call for reputation of click user

    var_1 = json.loads(api_call.text)
    return render_template('reputation.html', result=var_1, user_name=user_name)


@app.route('/test', methods=['GET', 'POST'])
def user_form():
    name = None
    form = Nameform()
    if form.validate_on_submit():
        name = form.name.data
        form.name.data = ''
    return render_template('test_form.html', form=form, name=name)



if __name__ == '__main__':
    app.run(debug=True)

渲染模板:

<div class="page-header">
<h1>Hello, {% if name!= None %}{{ name }}{% else %}Stranger{% endif %}!</h1>
</div>
<form method=post>
{{ form.name.label }} {{ form.name() }}
{{ form.submit() }}
</form>

为什么没有抛出任何错误?当字段为空时

您可以使用 form.errors 呈现错误消息。请注意,您还缺少 CSRF 令牌,这是验证所必需的,因为您没有禁用 WTF_CSRF_ENABLED,因此我添加了 {{ form.csrf_token }}。参见 CSRF Protection

<div class="page-header">
<h1>Hello, {% if name!= None %}{{ name }}{% else %}Stranger{% endif %}!</h1>
</div>
{% for field in form.errors %}
{% for error in form.errors[field] %}
    <div class="error">{{ error }}</div>
{% endfor %}
{% endfor %}
<form method=post>
{{ form.csrf_token }}
{{ form.name.label }} {{ form.name() }}
{{ form.submit() }}
</form>

我认为您没有在表单中包含 novalidate 属性。 novalidate 属性用于告诉 Web 浏览器不要对此表单中的字段应用验证,这实际上将此任务留给了服务器中的 Flask 应用程序 运行。 For Sample code