Ash*_*oat 10 python flask python-2.7 wtforms flask-wtforms
Flask-WTF's documentation states that:
Flask-WTF provides you a FileField to handle file uploading, it will automatically draw data from flask.request.files if the form is posted. The data attribute of FileField will be an instance of 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 %}
Run Code Online (Sandbox Code Playgroud)
_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 %}
Run Code Online (Sandbox Code Playgroud)
这是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)
Run Code Online (Sandbox Code Playgroud)
使用元素enctype上的属性form,打印类型是NoneType; 没有enctype属性,打印类型是unicode.FileStorage文档中公布的对象也不是.
Ash*_*oat 10
我查看了源代码(form.py)并找出了问题:FileStorage如果使用特定的表单初始化表单,则不会激活用对象替换默认数据属性的代码formdata.将formdata必须被保留未指定的文件功能的工作.替换此行:
form = SettingsForm(request.form)
Run Code Online (Sandbox Code Playgroud)
有了这条线:
form = SettingsForm()
Run Code Online (Sandbox Code Playgroud)
解决了这个问题.
| 归档时间: |
|
| 查看次数: |
2667 次 |
| 最近记录: |