【问题标题】:Upload with Flask-Uploads and Flask-WTF failing validation使用 Flask-Uploads 上传和 Flask-WTF 验证失败
【发布时间】:2015-07-20 21:10:48
【问题描述】:

我似乎无法弄清楚为什么一个字段失败而另一个字段成功上传文件。我可以很好地上传照片......但是当涉及到 pdf 时,我无法让它通过验证。我已经搜索了我的代码是否有任何问题,但找不到任何东西。有趣的是,我可以通过手动上传设置上传照片,这对我来说没有意义。我猜想我是如何用烧瓶上传配置烧瓶wtf的,但是看到网上没有关于如何一起使用这两者的文档,我只需要尽力而为。

任何帮助将不胜感激,因为我需要上传 pdf 文件,这让我很困惑。

代码如下...非常感谢!

config.py

UPLOADED_MANUALS_DEST = "C:/pyprojects/cc/uploads/eq_manuals/"
UPLOADED_MANUALS_ALLOW = 'pdf'
UPLOADED_PHOTOS_DEST = "C:/pyprojects/cc/uploads/eq_photos/"
UPLOADED_PHOTOS_ALLOW = 'png, jpg, jpeg'

__init__.py

from flaskext.uploads import UploadSet, configure_uploads, patch_request_class
photos = UploadSet('photos')
manuals = UploadSet('manuals')
configure_uploads(app, (photos, manuals))
patch_request_class(app)

forms.py

class EQForm(Form):
    name = StringField('Name', validators=[Required('Equipment Name is required.')])
    photo = FileField('Equipment Photo', validators=[
        FileAllowed(photos, 'Photo must be a png, jpg, or jpeg!')])
    manual = FileField('Equipment Manual', validators=[
        FileAllowed(manuals, 'Manual must be a pdf!')])

views.py

@app.route('/admin/equipment/', methods=['GET', 'POST'])
@roles_accepted('admin')
def equipment():

    eqform = EQForm()

    if eqform.validate_on_submit():
        # os.path.join() the secured filename and the root path from config.py imported as join()
        new_eq = Equipment(name = eqform.name.data)

        if eqform.photo.data:
            photo_path = join(
                app.config['UPLOADED_PHOTOS_DEST'],
                secure_filename(eqform.photo.data.filename)
                )

            eqform.photo.data.save(photo_path)
            new_eq.photo_path = photo_path

        if eqform.manual.data:
            manual_path = join(
                app.config['UPLOADED_MANUALS_DEST'],
                secure_filename(eqform.manual.data.filename)
                )

            eqform.manual.data.save(manual_path)
            new_eq.manual_path = manual_path

        db.session.add(new_eq)
        db.session.commit()

    equipment = Equipment.query.all()

    return render_template('equipment.html',
        title="Equipment Database",
        equipment = equipment,
        eqform = eqform
        )

equipment.html

        <form action="" method="POST" enctype="multipart/form-data" class="eq-field hide" name="eqform">
      {{ eqform.hidden_tag() }}
          <ul class="list-group">
            <li class="list-group-item">
              {{ eqform.name.label }}: {{ eqform.name }}
            </li>
            <li class="list-group-item">
              {{ eqform.photo.label }}: {{ eqform.photo }} <br>
              <span style="font-size:.75em;">Photo must be a png, jpg, or jpeg.</span>
            </li>
            <li class="list-group-item">
              {{ eqform.manual.label }}: {{ eqform.manual }} <br>
              <span style="font-size:.75em;">Manual must be a pdf.</span>
            </li>
          </ul>
          <input type="submit" class="btn btn-default" value="Submit">
        </form>

【问题讨论】:

  • 我一直在玩shell中的上传集。看来我的问题与我的应用程序没有正确使用我的配置中设置的项目有关。我的两个上传集似乎都有默认的允许扩展名列表,而不是我定义的那些。
  • 想通了......它总是那么愚蠢。我将扩展名列表作为字符串。将 'png, jpg, jpeg' 更改为 ('png', 'jpg', 'jpeg') 和瞧!有趣的是……对于我的 pdf,带有一个扩展名的列表仍然不起作用……所以我不得不制作它('pdf','PDF')

标签: python validation upload flask flask-wtforms


【解决方案1】:

我犯了一个愚蠢的错误:

UPLOADED_MANUALS_ALLOW = 'pdf'
UPLOADED_PHOTOS_ALLOW = 'png, jpg, jpeg'

我已经声明为字符串的这两个允许扩展名列表...将它们更改为:

UPLOADED_MANUALS_ALLOW = ('pdf')
UPLOADED_PHOTOS_ALLOW = ('png', 'jpg', 'jpeg')

但是,有趣的是:该列表仍然不适用于单个项目,所以我不得不添加两个:

UPLOADED_MANUALS_ALLOW = ('pdf', 'PDF')

【讨论】:

  • 我认为“列表仍然不适用于单个项目”只是一个 Python 元组问题。试试UPLOADED_MANUALS_ALLOW = 'pdf',UPLOADED_MANUALS_ALLOW = ('pdf',)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
相关资源
最近更新 更多