Как загрузить файлы изображений из формы в базу данных в среде Python Flask - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь загрузить изображение из формы в базу данных во Flask на учебном веб-сайте электронной коммерции, над которым я работаю.Я использую флеш-загрузку для обработки загрузки файлов, так как это кажется проще, чем другие способы загрузки файлов.Я получаю следующую ошибку "NameError: имя 'images' не определено".Эта ошибка, по-видимому, возникает в файле rout.py, который обрабатывает функции и маршрутизацию сайта.Я перечислю основные части кода ниже.Функция add_item в файле rout.py берет то, что было отправлено формой, и отправляет эти данные в базу данных. Как я уже сказал, именно здесь происходит ошибка, поскольку изображения не могут быть распознаны, но я не могу понять, как решить проблему .Init.py - это пакет, в котором хранится соединение колба-загрузка.Config.py используется для определения конфигураций приложения.Функция addItem в файле forms.py используется для разметки структуры формы.Файл HTML, который не включен в этот документ, поскольку я не думаю, что он связан с проблемой, использует структуру формы в forms.py для отображения формы на экране.

Я попытался найтирешение в Интернете, но нет очень подробных решений этой проблемы, и документация Python Flask уже достаточно ограничена, но Flask-Upload не имеет очень хорошей документации, особенно в отношении использования с базами данных.Я новичок в Python Flask, так что если кто-нибудь сможет мне помочь с этим вопросом, который будет очень признателен..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()])

1 Ответ

1 голос
/ 14 апреля 2019

Попробуйте это

         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)

Для большей безопасности при загрузке файлов.затем прочитайте ссылка

...