Правило FileAllowed
Правило FileAllowed применяется к полю
FileField или MultipleFileField
для проверки расширения загружаемого файла.
Первым параметром передаётся список разрешённых
расширений, вторым - сообщение об ошибке, которое
увидит пользователь при неверном типе файла.
Если расширение файла не входит в список, валидация
завершается ошибкой.
Синтаксис
FileAllowed(upload_set, message)
Пример
Давайте создадим форму с полем для загрузки
изображения и разрешим только расширения
png и jpg:
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import FileField, SubmitField
from wtforms.validators import FileAllowed
app = Flask(__name__)
app.config['SECRET_KEY'] = 'abcde'
class UploadForm(FlaskForm):
image = FileField('Image', validators=[FileAllowed(['png', 'jpg'], 'Only images!')])
submit = SubmitField('Upload')
@app.route('/', methods=['GET', 'POST'])
def index():
form = UploadForm()
if form.validate_on_submit():
return 'uploaded'
return render_template('index.html', form=form)
Шаблон для вывода формы:
<form method="post" enctype="multipart/form-data">
{{ form.hidden_tag() }}
{{ form.image() }}
{{ form.submit() }}
</form>
Если пользователь загрузит файл с расширением
png или jpg, форма успешно пройдёт
валидацию и вернётся строка:
uploaded
Если же расширение не входит в список,
в атрибуте errors появится сообщение
'Only images!'.
Пример
Давайте разрешим несколько типов документов и выведем ошибку валидации в шаблоне:
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import FileField, SubmitField
from wtforms.validators import FileAllowed
app = Flask(__name__)
app.config['SECRET_KEY'] = 'abcde'
class DocForm(FlaskForm):
doc = FileField('Document', validators=[FileAllowed(['pdf', 'doc', 'txt'], 'Bad format!')])
submit = SubmitField('Send')
@app.route('/', methods=['GET', 'POST'])
def index():
form = DocForm()
res = None
if form.validate_on_submit():
res = 'ok'
return render_template('index.html', form=form, res=res)
Шаблон с выводом ошибок:
<form method="post" enctype="multipart/form-data">
{{ form.hidden_tag() }}
{{ form.doc() }}
{% for error in form.doc.errors %}
<p>{{ error }}</p>
{% endfor %}
{{ form.submit() }}
</form>
{% if res %}
<p>{{ res }}</p>
{% endif %}
При загрузке файла с расширением pdf
в шаблоне появится строка:
ok
При загрузке файла с расширением exe
выведется сообщение об ошибке:
Bad format!
Смотрите также
-
правило
FileRequired,
которое проверяет, что файл был загружен -
правило
FileSize,
которое ограничивает размер загружаемого файла -
поле
FileField,
к которому обычно применяется это правило -
поле
MultipleFileField,
для загрузки нескольких файлов сразу