Flask добавление изображения к объекту класса, "статья с картинками"

Есть форма HTML, на вводе несколько текстовых полей и поле для загрузки файла - изображения. Есть бд. Думаю в базе хранить только путь к изображению в текстовом формате, а саму же картинку просто хранить в папке, пока что план такой. Вот сам класс:

class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
intro = db.Column(db.String(300), nullable=False)
text = db.Column(db.Text, nullable=False)
file = db.Column(db.String(100), nullable=False)
date = db.Column(db.DateTime, default=datetime.utcnow)

Форма для заполнения:

<form action="/create-article" method="post" enctype=multipart/form-data>
<input type="text" name="title" id="title" class="form-control"></br>
<textarea name="intro" id="intro" class="form-control"></textarea></br>
<textarea name="text" id="text" class="form-control"></textarea></br>
<input type="file" name="file" id="file">
<input type="submit" class="btn btn-success" value="Отправить">
</form>

Просто первоначальные настройки.

UPLOAD_FOLDER = """C:/Users/EMIL/PycharmProjects/flaskupldoadimage/images"""
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

И сам рут

@app.route('/create-article', methods=['POST', 'GET'])
def create_article():
        if request.method == 'POST':
            title = request.form['title']
            intro = request.form['intro']
            text = request.form['text']
            file = request.files['file']

            if file and allowed_file(file.filename):
                filename = secure_filename(file.filename)
                file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

            def uploaded_file(filename):
                return send_from_directory(app.config['UPLOAD_FOLDER'],
                                           filename)
            article = Article(title=title, intro=intro, text=text, file=uploaded_file(filename))
            with app.app_context():
                try:
                    db.session.add(article)
                    db.session.commit()
                    return redirect('/')
                except:
                    return 'Error'
        else:
            return render_template('create-article.html')

В целом все вроде бы не слишком сложно. Картинка в папку добавляется, а бд не обновляется, приложение возвращает 'Error'

Вот оригинальный код, который я пытался приспособить к своему приложению. Я всего лишь учусь, и задача у меня, скажем так, добавить на сайт статью с картинкой. Ну и потом конечно же буду выводить текст и картинку. Дело в том, что мне нужно именно одновременно добавлять в бд текстовые поля и изображение, и добавлять все это в базу данных, изображение конечно же в виде ссылки, чтобы потом уже работать с ним.

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return redirect(url_for('uploaded_file',
                                    filename=filename))
    else:
        return render_template('index.html')

@app.route('/uploads/<filename>')
def uploaded_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'],
                               filename)


<form action="" method=post enctype=multipart/form-data>
      <p><input type=file name=file>
         <input type=submit value=Upload>
    </form>

После добавления картинки возвращает uploads/картинка

Очень прошу помочь разобраться. Добавление картинок, по сути, последний шаг, и смогу практиковаться. С авторизацией худо-бедно справился, а вот тут никак.


Ответы (0 шт):