11

Flask-WTF のドキュメントには、次のように記載されています。

Flask-WTF は、ファイルのアップロードを処理するための FileField を提供します。フォームが投稿されると、flask.request.files から自動的にデータを取得します。FileField のデータ属性は、Werkzeug FileStorage のインスタンスになります。

しかし、私が使用すると、投稿後FileFieldの属性はオブジェクトではありません。代わりに、 (ドキュメントで提案されているようにフォームを定義する場合) またはファイル名を文字列として定義する場合 (定義しない場合) のいずれかです。dataFileStorageNoneenctype="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属性を使用するformと、印刷されるタイプは次のようになりNoneTypeます。enctype属性がない場合、印刷タイプはunicodeです。FileStorageドキュメントで宣伝されているオブジェクトでもありません。

4

2 に答える 2