2013-10-05 20 views
6

瓶,跆拳道的WERKZEUG FileStorage的實例documentation指出:燒瓶跆拳道的FileField不設置數據屬性

瓶,跆拳道爲您提供的FileField來處理文件上傳後,會自動吸取燒瓶數據.request.files如果表單已發佈。 FileField的數據屬性將是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屬性form元素,印刷類型爲NoneType;沒有enctype屬性,則打印類型爲unicode。本文檔所公佈的FileStorage對象也不是。

回答

5

我調查的源代碼(form.py),並計算出該問題:所述代碼來替換如果窗體與特定formdata初始化爲FileStorage對象的默認數據屬性不被激活。必須保留formdata才能使文件功能正常工作。更換這行:

form = SettingsForm(request.form) 

這一行:

form = SettingsForm() 

解決了這個問題。

+0

嗨感謝您的回答。我無法在form.py的源代碼中找到您引用的位置。你有更多的細節? –