为什么验证不能处理表单请求?

时间:2016-02-20 19:05:35

标签: python flask jinja2 flask-wtforms

我正在学习烧瓶并做了一个小应用程序。现在我正在努力学习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=stackoverflow')  # 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=stackoverflow')  # 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>

为什么不抛出任何错误?当田地空无一物时

2 个答案:

答案 0 :(得分:2)

您可以使用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>

答案 1 :(得分:1)

我认为您尚未将novalidate属性包含在表单中。 novalidate属性用于告知Web浏览器不要将验证应用于此表单中的字段,从而有效地将此任务留给服务器中运行的Flask应用程序。 For Sample code