代码之家  ›  专栏  ›  技术社区  ›  claudiadast

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

  •  0
  • claudiadast  · 技术社区  · 8 年前

    我正在为我的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])
    

    HTML:

    <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>
    

    使现代化 :

    我还尝试添加一个内置的验证器(例如 Length(min=6, max=120)) ,但这也没有得到执行。

    stack_name = StringField('STACK NAME', validators=[Length(min=4, max=120), DataRequired()])
    

    更新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:

    <div class="form-group required">
        {{ form.input_uri.label }}: {{ form.input_uri(placeholder="(e.g. s3://pipeline-run/fastqs/)...", oninput=", this.className = ''", name="input_uri") }}
    </div>
    

    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>
    

    结果: TypeError: html_params() got multiple values for keyword argument 'name'

    1 回复  |  直到 8 年前
        1
  •  0
  •   shifloni    8 年前

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

    在渲染的视图中,您应该使用 form.validate_on_submit() 为了让你的表格得到验证。我没有在你发布的HTML中看到你的整个表单代码,如果是这样,那么你缺少了一个提交按钮,该按钮将表单发送到服务器进行验证。

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

    你的表格应该使用 POST 在下面示例的方法中。 下面是一个示例,说明处理表单的视图应该与 类型在提交时验证

    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)