1

所以我所做的是我试图运行我的烧瓶应用程序,但突然我收到一个错误,即 TypeError: storage must be a werkzeug.FileStorage

这是我使用的代码...

初始化.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

配置文件

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')

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

路线.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")

有人能帮我吗?我对我如何得到错误有点困惑。我做错了什么吗?

我在那里找不到任何东西,所以对我来说这很令人困惑..使用烧瓶上传时应用程序工厂可能有问题吗?

追溯

4

2 回答 2

1

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

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

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

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

关于你的问题。

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

请修正上述建议,然后重试。

还要确保您不发送空表格。顺便说一句 - 您没有显示您的表单模板。也许没有data领域?

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

于 2020-07-02T13:40:33.380 回答
1

您所要做的就是在您的 HTML 文件中,设置 FORM "enctype = multipart/form-data"

于 2021-02-09T17:22:53.827 回答