Я создаю пользовательские валидаторы для своих входов в форму 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>
UPDATE
Я также пытался добавить встроенный валидатор (например, с 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'