Flask应用未选图片提交报错:TypeError: storage must be a werkzeug.FileStorage
解决Flask-Uploads未选图片提交时的TypeError问题
嘿,这个问题我之前也碰到过!咱们一步步来搞定它:
问题根源
当你没有选择任何图片就提交表单时,form.image.data并不是一个werkzeug.FileStorage对象(而是None或者空值),但photos.save()方法强制要求传入这个类型的参数,所以就触发了那个TypeError。
解决方案
我们需要做两处关键修改:
1. 让表单允许图片字段为空
首先确保你的WTForms表单类中,图片字段设置了允许为空的验证器,这样validate_on_submit()不会因为没传图片就验证失败:
from wtforms import FlaskForm, StringField, FileField, SubmitField from wtforms.validators import DataRequired, Optional class Add***(FlaskForm): screenname = StringField('Screenname', validators=[DataRequired()]) fullname = StringField('Fullname', validators=[DataRequired()]) team = StringField('Team', validators=[DataRequired()]) image = FileField('Image', validators=[Optional()]) # 这里添加Optional() submit = SubmitField('Add')
2. 在处理表单时先检查图片是否存在
在提交逻辑里,先判断form.image.data是否是有效的FileStorage对象,再调用保存方法:
from flask_uploads import UploadSet, configure_uploads, IMAGES from werkzeug.datastructures import FileStorage form = Add***() if form.validate_on_submit(): # 初始化图片URL为None(如果不需要图片的话) image_url = None # 检查是否有有效的文件对象 if form.image.data and isinstance(form.image.data, FileStorage): image_url = photos.url(photos.save(form.image.data)) # 创建新记录,注意image字段要允许为空 new_**** = ****( screenname=form.screenname.data, fullname=form.fullname.data, team=form.team.data, image=image_url ) db.session.add(new_****) db.session.commit() flash("Added Successfully") return redirect(url_for('****')) return render_template("****.html", form=form)
3. (可选)确保数据库字段允许为空
如果你的数据库模型中image字段是必填的,记得修改为允许为空:
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class ****(db.Model): id = db.Column(db.Integer, primary_key=True) screenname = db.Column(db.String(100), nullable=False) fullname = db.Column(db.String(100), nullable=False) team = db.Column(db.String(100), nullable=False) image = db.Column(db.String(200), nullable=True) # 设置nullable=True
这样修改后,当你不选择图片提交时,程序会跳过图片保存步骤,正常创建记录并跳转页面,再也不会触发那个类型错误啦!
内容的提问来源于stack exchange,提问作者Vick Singh
相关产品推荐
相关产品推荐

