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/картинка
Очень прошу помочь разобраться. Добавление картинок, по сути, последний шаг, и смогу практиковаться. С авторизацией худо-бедно справился, а вот тут никак.