Переход с Flask-Uploads¶
Flask-Uploader является более функциональной и гибкой альтернативой
для известного в узких кругах Flask-Uploads.
Этот раздел поможет вам мигрировать на Flask-Uploader
.
1. UploadSet¶
В Flask-Uploads
мы создаем UploadSet
для валидации загруженного файла по расширению и для сохранения его на жестком диске.
Пример взят из документации к Flask-Uploads:
from flask_uploads import UploadSet, IMAGES
photos = UploadSet('photos', IMAGES)
В Flask-Uploader
нужно создать загрузчик и хранилище:
from flask_uploader import Uploader
from flask_uploader.storages import FileSystemStorage
from flask_uploader.validators import ExtensionValidator
photos = Uploader(
'photos',
FileSystemStorage(dest='photos'),
validators=[
ExtensionValidator(
ExtensionValidator.IMAGES
),
]
)
2. Входная точка¶
Пример взят из документации к Flask-Uploads:
@app.route('/upload', methods=['GET', 'POST'])
def upload():
if request.method == 'POST' and 'photo' in request.files:
filename = photos.save(request.files['photo'])
rec = Photo(filename=filename, user=g.user.id)
rec.store()
flash('Photo saved.')
return redirect(url_for('show', id=rec.id))
return render_template('upload.html')
@app.route('/photo/<id>')
def show(id):
photo = Photo.load(id)
if photo is None:
abort(404)
url = photos.url(photo.filename)
return render_template('show.html', url=url, photo=photo)
Вот так этот пример может быть переписан с использованием Flask-Uploader
:
@app.route('/upload', methods=['GET', 'POST'])
def upload():
if request.method == 'POST' and 'photo' in request.files:
lookup = photos.save(request.files['photo'])
rec = Photo(lookup=lookup, user=g.user.id)
rec.store()
flash('Photo saved.')
return redirect(url_for('show', id=rec.id))
return render_template('upload.html')
@app.route('/photo/<id>')
def show(id):
photo = Photo.load(id)
if photo is None:
abort(404)
url = photos.get_url(photo.lookup)
return render_template('show.html', url=url, photo=photo)
3. Конфигурация приложения¶
В Flask-Uploads
для инициализации требуются все ранее созданные экземпляры UploadSet
:
from flask_uploads import configure_uploads
configure_uploads(app, (photos,))
В Flask-Uploader
достаточно вызвать функцию init_uploader()
с единственным обязательным аргументом - экземпляром приложения:
from flask_uploader import init_uploader
init_uploader(app)
4. Предостережение¶
Рассмотренный выше код я бы не рекомендовал использовать в производственной среде.
Во-первых, в нем нет отлова исключений как для Flask-Uploads
, так и для Flask-Uploader
.
Во-вторых, Flask-Uploader
дает больше возможностей по тонкой настройке и расширению.
Приведенный материал показывает ключевые моменты, связанные с переходом на мое расширение, однако вам стоит прочитать всю документацию, чтобы оценить весь масштаб возможностей и использовать расширение правильно.