Поле формы FileField
Поле FileField применяется в классе формы
Flask-WTF и создаёт поле для загрузки одного файла.
При отправке формы браузер передаёт файл на сервер,
а само поле хранит объект файла, который можно
прочитать или сохранить на диск. Первым параметром
передаётся подпись поля, которая отображается
рядом с кнопкой выбора файла.
Синтаксис
from wtforms import FileField
field = FileField(label, [validators])
Пример
Давайте создадим форму с полем FileField
и выведем её на странице:
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import FileField, SubmitField
app = Flask(__name__)
app.config['SECRET_KEY'] = 'abcde'
class UploadForm(FlaskForm):
file = FileField('Файл')
submit = SubmitField('Загрузить')
@app.route('/', methods=['GET', 'POST'])
def index():
form = UploadForm()
if form.validate_on_submit():
f = form.file.data
return f.filename
return render_template('index.html', form=form)
Теперь создадим шаблон для вывода формы:
<form method="post" enctype="multipart/form-data">
{{ form.hidden_tag() }}
<p>{{ form.file.label }} {{ form.file() }}</p>
<p>{{ form.submit() }}</p>
</form>
После выбора файла 'article' и отправки формы
результат выполнения кода будет следующим:
"article"
Пример
Давайте сохраним загруженный файл на диск
с помощью метода save:
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import FileField, SubmitField
app = Flask(__name__)
app.config['SECRET_KEY'] = 'abcde'
class UploadForm(FlaskForm):
file = FileField('Файл')
submit = SubmitField('Загрузить')
@app.route('/', methods=['GET', 'POST'])
def index():
form = UploadForm()
if form.validate_on_submit():
f = form.file.data
f.save('uploads/' + f.filename)
return 'saved'
return render_template('index.html', form=form)
Результат выполнения кода после успешной загрузки:
"saved"
Пример
Давайте добавим валидатор FileAllowed,
чтобы разрешить загрузку только изображений:
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import FileField, SubmitField
from flask_wtf.file import FileAllowed
app = Flask(__name__)
app.config['SECRET_KEY'] = 'abcde'
class UploadForm(FlaskForm):
file = FileField('Файл', validators=[FileAllowed(['jpg', 'png'])])
submit = SubmitField('Загрузить')
@app.route('/', methods=['GET', 'POST'])
def index():
form = UploadForm()
if form.validate_on_submit():
f = form.file.data
f.save('uploads/' + f.filename)
return 'saved'
return render_template('index.html', form=form)
Теперь при попытке загрузить файл 'abcde.txt'
форма не пройдёт валидацию, а в атрибуте errors
появится сообщение об ошибке:
{'file': ['File type not allowed']}
Смотрите также
-
класс
FlaskForm,
от которого наследуются все формы -
класс
FileAllowed,
который разрешает загрузку только указанных расширений -
класс
FileSize,
который ограничивает максимальный размер файла -
поле
MultipleFileField,
которое позволяет загружать несколько файлов сразу