С учетом предоставленной вами ограниченной информации я постараюсь реализовать желаемую функциональность.
Ваш ContactForm
может оставаться таким:
class ContactForm(FlaskForm):
name = IntegerField('File Name', validators=[Length(min=-1, max=100, message='You cannot have more than 100 characters')])
filename = FileField()
Затем вы передаете объект формыв шаблон, из пользовательского маршрута фляги, давайте позвоним с целью объяснения, контактный маршрут :
@app.route('/contact')
def contact():
contact_form = ContactForm()
return render_template('contact.html'
contact_form = contact_form)
А в вашем шаблоне, который я назвал в этом примере contact.html
,Вы предоставляете свою форму:
<form action="" method="post" enctype="multipart/form-data">
{{ contact_form.csrf_token }}
{{ contact_form.name }}
{{ contact_form.filename}}
<input type="submit"/>
</form>
В этой форме мы хотим с action=""
отправлять данные POST по тому же маршруту, то есть маршрут контакта .Таким образом, в этом примере мы также должны проверить данные в методе contact()
приложения колбы.Но что может быть enctype="multipart/form-data"
вам может быть интересно?
Первый результат поиска того, что он дает, дает нам результаты:
Атрибут enctype указывает, как должны кодироваться данные формы, когдаотправив его на сервер. Примечание : Атрибут enctype можно использовать, только если method = "post".
И для multipart/form-data
:
Никакие символы не закодированы,Это значение требуется, когда вы используете формы, которые имеют элемент управления загрузкой файлов.
Наконец, мы обновляем приложение фляги контактный маршрут следующим образом:
@app.route('/contact')
def contact():
contact_form = ContactForm()
if form.validate_on_submit():
f = contact_form.filename.data
name = contact_form.name.data
f.save(os.path.join("./static/contacts/", name))
redirect(url_for('contact'))
return render_template('contact.html'
contact_form = contact_form)
Мы успешно собрали данные из формы и сохранили файл в папке контактов в статическом виде с именем из формы.Может быть, дополнительно мы могли бы использовать secure_filename
из werkzeug.utils
.