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”
所以我所做的是尝试 运行 我的烧瓶应用程序,但突然出现错误 类型错误:存储必须是 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”