我正在尝试将图像从表单上载到Flask上正在使用的实践电子商务网站中的数据库中。我正在使用flask-uploads来处理文件上传,因为它似乎比其他上传文件的方式容易。我收到以下错误“ NameError:未定义名称'images'”。该错误似乎是在处理网站的功能和路由的routes.py文件中发生的。我将在下面列出代码的主要部分。 route.py文件中的add_item函数采用表单提交的内容,并将该数据发送到数据库。 正如我所说,这是发生错误的地方,因为无法识别图像,但我不知道如何解决该问题。 Init.py是一个软件包,其中包含进行flask-uploads连接的位置。 Config.py用于定义应用程序的配置。 Forms.py文件中的addItem函数用于布局表单的结构。本文档未包含的HTML文件,因为我认为它没有链接到该问题,它使用forms.py中的表单结构在屏幕上显示该表单。
我尝试过在线查找解决方案,但是没有非常详细的解决方案,Python Flask的文档已经足够有限,但是Flask-Upload并没有很好的文档,尤其是与数据库。我是Python Flask的新手,所以如果有人可以帮助我解决这个问题,将不胜感激。
routes.py:
#addItem page
@app.route('/add_Item',methods=["GET","POST"])
add_Item():
form = addItem()
if form.validate_on_submit():
filename = images.save(request.files['image'])
url = images.url(filename)
item = Item(title=form.name.data,price=form.price.data,description=form.description.data,stock=form.stock.data,vendorid=current_user.id,image=url)
db.session.add(item)
db.session.commit()
flash("Congratulations, your item has been added")
return redirect(url_for('vendor',username=current_user.username))
else:
return render_template('addItem.html', title="Add Item", form=form)
init.py:
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
from flask_uploads import UploadSet, IMAGES, configure_uploads
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
login = LoginManager(app)
# Configure the image uploading via Flask-Uploads
images = UploadSet('images', IMAGES)
configure_uploads(app, images)
from app import routes, models, errors
config.py
import os
basedir = os.path.abspath(os.path.dirname(__file__))
TOP_LEVEL_DIR = os.path.abspath(os.curdir)
class Config(object):
SECRET_KEY = os.environ.get('SECRET_KEY') or 'abcdef'
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'app.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
UPLOADS_DEFAULT_DEST = TOP_LEVEL_DIR + '/app/static/img/'
UPLOADS_DEFAULT_URL = 'http://localhost:5000/static/img/'
UPLOADED_IMAGES_DEST = TOP_LEVEL_DIR + '/app/static/img/'
UPLOADED_IMAGES_URL = 'http://localhost:5000/static/img/'
forms.py
class addItem(FlaskForm):
name = StringField('Name',validators=[DataRequired()])
price = IntegerField('Price',validators=[DataRequired()])
description = StringField('Description',validators=[DataRequired()])
stock = IntegerField('Stock',validators=[DataRequired()])
image = FileField('Image', validators=[FileRequired(), FileAllowed(images, 'Images only!')])
submit = SubmitField('Submit',validators=[DataRequired()])
答案 0 :(得分:1)
尝试一下
f = request.files['image']
f.save(secure_filename(f.filename))
url = f.filename
在这里您可以看到我对文件名使用了 secured_filename()。这是为了防止目录遍历攻击。
url 是文件名,图像将与您的应用程序代码保存在同一目录中。
最后,您的代码如下所示
#addItem page
@app.route('/add_Item',methods=["GET","POST"])
add_Item():
form = addItem()
if form.validate_on_submit():
f = request.files['image']
f.save(secure_filename(f.filename))
url = f.filename
item = Item(title=form.name.data,price=form.price.data,description=form.description.data,stock=form.stock.data,vendorid=current_user.id,image=url)
db.session.add(item)
db.session.commit()
flash("Congratulations, your item has been added")
return redirect(url_for('vendor',username=current_user.username))
else:
return render_template('addItem.html', title="Add Item", form=form)
为文件上传提供更高级的安全性。然后阅读link