11

Flask-WTF 的文档指出:

Flask-WTF 为您提供了一个 FileField 来处理文件上传,如果表单已发布,它将自动从 flask.request.files 中提取数据。FileField 的 data 属性将是 Werkzeug FileStorage 的一个实例。

但是,当我使用 时FileField,发布后的data属性不是FileStorage对象。相反,它要么是None(如果我按照文档中的建议定义我的表单enctype="multipart/form-data")或文件名作为字符串(如果我没有定义一个enctype)。

这是相关的 Jinja2 模板:

{% from "_form.html" import render_field %}
{% block body %}
  <section class="page-width-container" id="offset-content">
    <div id="utility-box">
      <h1 class="utility-header">Settings</h1>
      {{ message }}
      <form action="/settings" method="post" enctype="multipart/form-data">
        {{ render_field(form.photo) }}
        <input type="submit" class="form-action" value="Save" />
      </form>
    </div>
  </section>
{% endblock %}

_form.html 宏:

{% macro render_field(field) %}
  <div class="field">
    {{ field.label }}
    <span class="form-input">{{ field()|safe }}</span>
    <div class="clear"></div>
    {% if field.errors %}
    <ul class="errors">
      {% for error in field.errors %}
      <li>{{ error }}</li>
      {% endfor %}
    </ul>
    {% endif %}
  </div>
{% endmacro %}

这是Python:

from flask import Blueprint, render_template, request
from flask.ext.wtf import Form
from flask.ext.wtf.file import FileField, FileRequired

settings_bp = Blueprint('settings', __name__)

class SettingsForm(Form):
  photo = FileField('Photo', validators=[
    FileRequired('no file!'),
  ])

@settings_bp.route('/settings', methods=['GET', 'POST'])
def login():
  form = SettingsForm(request.form)
  form.validate_on_submit()
  print(type(form.photo.data))
  return render_template('settings.html', form=form, message=form.photo.data)

使用元素enctype上的属性,打印的类型是; 没有属性,打印的类型是. 文档所宣传的对象也不是。formNoneTypeenctypeunicodeFileStorage

4

2 回答 2

12

我查看了源代码 ( form.py) 并发现了问题:FileStorage如果表单使用特定的formdata. formdata必须保持未指定才能使文件功能正常工作。替换此行:

form = SettingsForm(request.form)

有了这条线:

form = SettingsForm()

解决了这个问题。

于 2013-10-06T01:02:16.170 回答
0


将传递的表单数据从form = SettingsForm(request.form)to清除的替代方法form = SettingsForm()

是通过flask-wtf 文档所建议的therequest.form the 。request.files

from flask import request
from werkzeug.datastructures import CombinedMultiDict

form = SettingsForm(CombinedMultiDict((request.files, request.form)))
于 2020-09-11T01:38:41.433 回答