带有wtforms的Flask WTF文件上载未通过验证



我试图将一个文件上传到Flask Form,但在通过验证时遇到了问题。我一直在关注文档,并尝试了当前的方法和CombinedMultiDict()提交到表单中,但没有成功。我已经把错误打印出来了。

print(form.validate_on_submit())
False
print(form.errors)
{'upload': ['This field is required.']}

导入。。

import os
from flask import Flask, render_template, request, flash, redirect, url_for, session, logging
from flask_mysqldb import MySQL
from wtforms import Form, SelectField, StringField, TextAreaField, PasswordField, BooleanField,validators
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired, FileAllowed
from werkzeug.utils import secure_filename

这是我的表格。

class UploadFileForm(FlaskForm):
file_name = StringField('File Title', [
validators.Length(min=4, max=35, message="File Title must be between 4 & 35 characters."),
validators.Regexp(username_reg, message="File Title can contain only letters, numbers or underscores.")
])
file_desc = TextAreaField('Body', [
validators.Length(max=500),
validators.Regexp(group_reg, message="The description can only contain letters, numbers, underscores, dashes, exclaimation/question marks, or periods."),
validators.Optional()
])
upload = FileField('File', validators=[FileRequired()])

我的看法。。。

@app.route('/upload_file', methods=['GET', 'POST'])
def upload_file():
form = UploadFileForm():
if form.validate_on_submit(): 
print('========================')
# file_name = secure_filename(form.file.data)
file_name = form.file_name.data
file_desc = form.file_desc.data
file_path = os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(form.upload.data.filename))
form.upload.data.save(file_path)
# Get user and group
user = User.query.filter_by(username=session.get('username')).first()
group = Group.query.filter_by(groupname=session.get('groupname')).first()
# Add to DB
new_file = File(file_name=file_name, file_desc=file_desc, file_path=file_path, uploader=user.username, user=user, group=group)
db.session.add(new_file)
db.session.commit()
flash('File Uploaded!')
return redirect(url_for('dashboard'))
return render_template('upload_file.html', form=form)

HTML页面。。。

{% extends 'layout.html'%}
{% block body %}
<h1>Upload File</h1>
{% from "includes/_formhelpers.html" import render_field %}
<form method="POST" action="" enctype="multipart/form-data">
{{ form.csrf_token }}
<div class="form-group">
{{render_field(form.file_name, class_="form-control")}}
</div>
<div class="form-group">
{{render_field(form.file_desc, class_="form-control")}}
</div>
<div class="form-group">
{{render_field(form.upload, class_="form-control")}}
</div>
<input type="submit" class="btn btn-primary" value="Submit">
</form>
{% endblock %}

当我提交文件时,它会忽略提交的文件,从而导致验证失败。我是验证错误了,还是把表格搞砸了?

提前感谢!

--更新--
仍在与空白文件问题作斗争。我已经玩了一些表单和html,但当我提交表单时,仍然没有得到任何输入。

新表单(只是稍微更改了上传字段,并添加了一个表单提交(。。。

class UploadFileForm(FlaskForm):
file_name = StringField('File Title', [
validators.Length(min=4, max=35, message="File Title must be between 4 & 35 characters."),
validators.Regexp(username_reg, message="File Title can contain only letters, numbers or underscores.")
])
file_desc = TextAreaField('Body', [
validators.Length(max=500),
validators.Regexp(group_reg, message="The description can only contain letters, numbers, underscores, dashes, exclaimation/question marks, or periods."),
validators.Optional()
])
upload = FileField('File', validators=[FileRequired(), FileAllowed(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'ppt'], 'Invalid File Type. Must be .txt, .pdf, .png, .jpeg')])
submit = SubmitField('Post')

新HTML(只是更改了提交按钮,出于绝望添加了fieldset标记,并更改了表单。上传输入(。。。

<h1>Upload File</h1>
{% from "includes/_formhelpers.html" import render_field %}
<form method="POST" action="" enctype=“multipart/form-data”>
{{ form.csrf_token }}
<fieldset class="form-group">
<div class="form-group">
{{render_field(form.file_name, class_="form-control")}}
</div>
<div class="form-group">
{{render_field(form.file_desc, class_="form-control")}}
</div>
<div class="form-group">
{{ form.upload(class="form-control-file") }}
</div>
</fieldset>
<div class="form-group">
{{ form.submit(class="btn btn-primary") }}
</div>
</form>

视图保持不变。我认为问题集中在html表单中,因为表单发布时没有问题。我处理文件导入表单有错吗?

最终修复了它。将表单更改为…

{% block body %}
<h1>Upload File</h1>
{% from "includes/_formhelpers.html" import render_field %}
<form method="POST" action="" enctype="multipart/form-data">
{{ form.hidden_tag() }}
<fieldset class="form-group">
<div class="form-group">
{{render_field(form.file_name, class_="form-control")}}
</div>
<div class="form-group">
{{render_field(form.file_desc, class_="form-control")}}
</div>
<div class="form-group">
{{ form.upload.label() }}
{{ form.upload(class="form-control-file") }}
</div>
</fieldset>
<div class="form-group">
{{ form.submit(class="btn btn-outline-info") }}
</div>
</form>
{% endblock %}

还调整了一些其他进口商品。

如这里所建议的,解决方案是将:
form = UploadFileForm(request.form)
更改为:
form = UploadFileForm()

最新更新