Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用自定义验证器时Flask表单未显示错误_Python_Html_Flask_Flask Wtforms - Fatal编程技术网

Python 使用自定义验证器时Flask表单未显示错误

Python 使用自定义验证器时Flask表单未显示错误,python,html,flask,flask-wtforms,Python,Html,Flask,Flask Wtforms,我正在为我的Flask表单输入创建自定义验证器,例如,我在下面定义了一个函数,用于检查输入中是否包含“s3://”,如果没有,我希望它抛出一个错误 当我对此进行测试并在输入中省略“s3://”时,不会抛出任何错误。我做错了什么 表单类: from flask_wtf import FlaskForm from wtforms import StringField, TextField, SubmitField, IntegerField, SelectField, validators from

我正在为我的Flask表单输入创建自定义验证器,例如,我在下面定义了一个函数,用于检查输入中是否包含“s3://”,如果没有,我希望它抛出一个错误

当我对此进行测试并在输入中省略“s3://”时,不会抛出任何错误。我做错了什么

表单类:

from flask_wtf import FlaskForm
from wtforms import StringField, TextField, SubmitField, IntegerField, SelectField, validators
from wtforms.validators import ValidationError
import boto3

# CUSTOM VALIDATOR
def is_s3_uri(form, field):
    if "s3://" not in field.data:
        raise ValidationError('Bucket name must contain full path. Missing "s3://".')

class InputForm(FlaskForm):

    input_uri = StringField('INPUT BUCKET', validators=[validators.required(), is_s3_uri])
    output_uri = StringField('OUTPUT BUCKET', validators=[validators.required(), is_s3_uri])
<div class="tab">
    <h3>File Locations:</h3>
    <div class="form-group required">
        {{ form.input_uri.label }}: {{ form.input_uri(placeholder="(e.g. s3://pipeline-run/fastqs/)...", oninput=", this.className = ''") }}
    </div>
        {% if form.input_uri.errors %}
            <ul class="errors">{% for error in form.input_uri.errors %}<li>{{ error }}</li>{% endfor %}</ul>
        {% endif %}
    <div class="form-group required">
        {{ form.output_uri.label }}: {{ form.output_uri(placeholder="(e.g. s3://pipeline-run/results/)...", oninput="this.className = ''") }}
    </div>
        {% if form.input_uri.errors %}
            <ul class="errors">{% for error in form.output_uri.errors %}<li>{{ error }}</li>{% endfor %}</ul>
        {% endif %}
</div>
HTML:

from flask_wtf import FlaskForm
from wtforms import StringField, TextField, SubmitField, IntegerField, SelectField, validators
from wtforms.validators import ValidationError
import boto3

# CUSTOM VALIDATOR
def is_s3_uri(form, field):
    if "s3://" not in field.data:
        raise ValidationError('Bucket name must contain full path. Missing "s3://".')

class InputForm(FlaskForm):

    input_uri = StringField('INPUT BUCKET', validators=[validators.required(), is_s3_uri])
    output_uri = StringField('OUTPUT BUCKET', validators=[validators.required(), is_s3_uri])
<div class="tab">
    <h3>File Locations:</h3>
    <div class="form-group required">
        {{ form.input_uri.label }}: {{ form.input_uri(placeholder="(e.g. s3://pipeline-run/fastqs/)...", oninput=", this.className = ''") }}
    </div>
        {% if form.input_uri.errors %}
            <ul class="errors">{% for error in form.input_uri.errors %}<li>{{ error }}</li>{% endfor %}</ul>
        {% endif %}
    <div class="form-group required">
        {{ form.output_uri.label }}: {{ form.output_uri(placeholder="(e.g. s3://pipeline-run/results/)...", oninput="this.className = ''") }}
    </div>
        {% if form.input_uri.errors %}
            <ul class="errors">{% for error in form.output_uri.errors %}<li>{{ error }}</li>{% endfor %}</ul>
        {% endif %}
</div>
更新2

@app.route('/', methods=['GET', 'POST'])
def pipeline():

   INPUT_URI = ''
   OUTPUT_URI = ''

   form = InputForm(request.form)

   if request.method == 'POST':
       if form.validate_on_submit():
           INPUT_URI = request.form['input_uri']
           OUTPUT_URI = request.form['output_uri']

           # process info

       else:
           flash('Invalid params. Please re-try.', 'danger')
           return redirect(request.path)

   return render_template('pipeline-alt.html', 
                        title='Pipeline Input', 
                        form=form)
更新3: 使用Jquery表单验证插件

HTML:


{{form.input_uri.label}:{{form.input_uri(占位符=“(例如s3://pipeline run/fastqs/)…”,oninput=“,this.className=”,name=“input_uri”)}
JQuery:

<script>

$(document).ready(function () {

    $('#regForm').validate({ // initialize the plugin
        rules: {
            input_uri: {
                required: true,
                minlength: 4
            }
        },
        submitHandler: function (form) { // for demo
            alert('valid form submitted'); // for demo
            return false; // for demo
        }
    });

});

</script>

$(文档).ready(函数(){
$('#regForm')。验证({//初始化插件
规则:{
输入uri:{
要求:正确,
最小长度:4
}
},
submitHandler:函数(表单){//用于演示
警报(“已提交的有效表单”);//用于演示
返回false;//用于演示
}
});
});

结果:
TypeError:html_params()为关键字参数“name”获取了多个值

是否在提交时验证表单?你没有发布足够的代码,但我会尽力帮助你

在呈现的视图中,您应该使用
form.validate\u on\u submit()
,以便表单得到验证。我没有在您发布的HTML中看到您的整个表单代码,如果是这样,那么您缺少一个提交按钮,该按钮将表单发送到服务器进行验证

请发布您的视图(呈现表单)代码

您的表单应在下面示例的方法中使用
POST
。 处理表单的视图应该与
form.validate\u on\u submit()


请参阅上面的更新2。即使在提交时添加
验证()
,我仍然会遇到同样的问题。此外,这是一个多页表单,因此我希望在同一页上显示错误的输入,而不是在最后一页上单击“提交”。确实有一个提交按钮。为了在不提交表单的情况下立即出现错误的输入错误,您必须使用javascript。WTForms仅在页面加载时呈现,在点击submit之前不会与服务器交互。您可以使用jqueryvalidate,它广泛用于客户端验证。使用这个jQuery插件,您可以实现您想要的。我尝试了一个JS解决方案(请参见
update3
),但在jQuery脚本中按名称引用输入时似乎遇到了问题。
from flask import request
@app.route('/form_route', methods=['GET', 'POST'])
def form_route():
    form = YourFormClass()
    if request.method == 'POST':
        if form.validate_on_submit():
        # validation will be triggered from the if statement and if it validates, it will enter this if block
        # perform actions if the form is valid
        else:
        # do somthing if the form is not valid
    return render_template(form=form)