TypeError: storage must be a werkzeug.FileStorage in Flask Upload

TypeError: storage must be a werkzeug.FileStorage in Flask Upload

所以我所做的是尝试 运行 我的烧瓶应用程序,但突然出现错误 类型错误:存储必须是 werkzeug.FileStorage

这是我使用的代码...

init.py

# IMPORT

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_migrate import Migrate
from flask_login import LoginManager
from flask_uploads import UploadSet, configure_uploads, IMAGES, patch_request_class
from blogapp.config import Config

# INIT

db = SQLAlchemy()
bcrypt = Bcrypt()
login_manager = LoginManager()
migrate = Migrate()
login_manager.login_view = 'users.login'
login_manager.login_message_category = 'info'
photos = UploadSet('photos', IMAGES)

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(Config)

    db.init_app(app)
    bcrypt.init_app(app)
    login_manager.init_app(app)
    migrate.init_app(app, db)
    configure_uploads(app, photos)
    patch_request_class(app)  

    from blogapp.users.routes import users
    from blogapp.posts.routes import posts
    from blogapp.main.routes import main
    from blogapp.errors.handlers import errors
    app.register_blueprint(users)
    app.register_blueprint(posts)
    app.register_blueprint(main)
    app.register_blueprint(errors)

    return app

config.py

import os

basedir = os.path.abspath(os.path.dirname(__file__))

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY')
    SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI')
    UPLOADED_PHOTOS_DEST = os.path.join(basedir, 'uploads')

我的父目录中有一个上传文件夹

routes.py

from flask import (render_template, url_for, flash,
                   redirect, request, abort, Blueprint)
from flask_login import current_user, login_required
from blogapp import db, photos
from blogapp.models import Post
from blogapp.posts.forms import PostForm

posts = Blueprint('posts', __name__)

@posts.route("/post/new", methods=['GET', 'POST'])
@login_required
def new_post():
    form = PostForm()
    if form.validate_on_submit():
        filename = photos.save(form.photo.data)
        file_url = photos.url(filename)
    else:
        file_url = None
    if form.validate_on_submit():
        post = Post(title=form.title.data, content=form.content.data, image=form.photo.data, author=current_user)
        db.session.add(post)
        db.session.commit()
        flash('Your post has been created!', 'success')
        return redirect(url_for('main.home'))
    return render_template('create_post.html', title='New Post', 
                            form=form, file_url=file_url, legend="Post")

有人可以帮助我吗? 我对如何得到错误有点困惑.. 我是不是做错了什么?

我在那里找不到任何东西,所以对我来说这很混乱.. 会不会是应用工厂在使用flask upload时出了问题?

Traceback

当我查看您的 routes.py 时,我发现了一些可能的问题。

new_post 确实接受 get 和 post 请求,但不会以不同方式处理它们。

例如通常当有一个 get 请求时,你只想呈现空表单,但是当有一个 post 请求时,你想要例如保存文件。

您有两个 if form.validate_on_submit 语句。当您将 else 移到底部,就在 return 语句上方时,您可以简化它们。实际上,您不需要 else 路径,因为当 if 路径有效时,您已经将函数保留为 return redirect

关于你的问题。

错误消息清楚地表明,form.photo.data 没有上传文件。

请修改以上建议后重试

另外请确保您没有发送空表格。顺便说一句 - 你没有显示你的表单模板。也许没有 data 字段?

如果您遵循了所有建议,但没有成功,请在例如之后设置一个断点。 form = PostForm() 并仔细检查您的程序,尤其是检查 form.photo.data 显示的值。

您所要做的就是在您的 HTML 文件中,设置表单“enctype = multipart/form-data”