【问题标题】:Why validation not working on form request?为什么验证不适用于表单请求?
【发布时间】:2016-06-02 08:23:10
【问题描述】:

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

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

【问题讨论】:

    标签: python flask jinja2 flask-wtforms


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-13
        • 1970-01-01
        相关资源
        最近更新 更多