selectel_storage
Пакет реализует поля к ORM для хрананение файлов приложения в облачном хранилище компании Selectel
Преимущества:
- Файлы храняться в формате gzip.
- В качестве имени берется md5 от контента файла, что бы избжать дубликатов
- Двух уровневая структура папок
- В базе данных храниться только путь до файла в хранилище
Для работы необходимо:
- Создать контейнер в обрачном хранилище
- Создать в облочном хранилище пользователя с правами доступа к этому контейнеру
Установка
pip install selectel-storage
Flask + MongoEngine
import selectel_storage
from flask import Flask
from flask.ext.mongoengine import MongoEngine
from selectel_storage.flask import SelectelStorage
app = Flask(__name__)
app.config['MONGODB_SETTINGS'] = {
'db': 'project1',
'username':'webapp',
'password':'pwd123'
}
app.config['SELECTEL_STORAGE'] = {
'USER': 'username',
'PASSWORD': 'password',
'CONTAINER': 'images'
}
db = MongoEngine(app)
selectel = SelectelStorage(app)
class Images(db.Document):
name = db.StringField()
file = selectel.mongoengine.SelectelStorageField(root='images/')
Для создания объекта можно использовать стандартный FileHandler
logo = open('logo.png', 'rb')
image = Image.objects.create(name='logo.png', file=logo)
также подойдут StringIO, TemporaryFile и любые другие объекты реализующие метод "read"
Дальшейшая работа с файлом ничем не отличается от работы со стандартным файловым объектом
Получение контена и его mimetype
@app.route("/image/<image_id>")
def serve_image(image_id):
image = Image.obkects.get_or_404(id=image_id)
return Response(image.file.read(), mimetype=image.file.mimetype)
Удаление файла (полное удаление из облачного хранилища)
image.file.delete()
Внимание: при удалении файла само поле file не изменяется и вызове метода "save()" файл вновь создатся.