| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
parent directory.. | ||||
Здесь описаны базовые методы взаимодействия с Minio на python, а также небольшой
реальный пример использования этих функций.
Предполагается, что кластер Minio уже запущен по адресу localhost:9000.
Во-первых, установим Python библиотеку для взаимодействия с MinIO:
pip3 install minio
Воспользуемся методом из данной библиотеки для создания объекта подключения к нашему кластеру Minio:
from minio import Minio
client = Minio(endpoint="localhost:9000", # адрес сервера
access_key='minio', # логин админа
secret_key='minio124', # пароль админа
secure=False) # опциональный параметр, отвечающий за вкл/выкл защищенное TLS соединениеВсе методы взаимодействия с хранилищем будут вызываться при обращении к этому объекту.
Далее приведены основные методы, необходимые для работы с хранилищем.
Сразу стоит отметить, что в minio отсутствует метод для создания новых пользователей. Как вариант, вместо как таковых пользователей можно использовать отдельные бакеты, а подключение осуществлять только через админа.
Для создания бакета используется функция make_buсket:
def add_new_bucket(name:str):
client = Minio(endpoint='localhost:9000',
access_key='minio',
secret_key='minio124')
client.make_bucket(bucket_name=name) # создание бакетаДругие функции для манипуляции бакетами:
list = client.list_buckets() # возвращает список всех бакетов
client.bucket_exists(bucket_name) # проверяет существование бакета с данным названием
# возвращает true или false
client.remove_bucket(bucket_name) # удаление бакетаДля загрузки / выгрузки объектов существует 2 подхода: через файлы и через поток байтов. Принципиального различия в этих методах нет, можно выбирать наиболее удобный и эффективный в рамках конкретной задачи. Функции чтения / записи:
# запись объекта в хранилище из файла
client.fput_object(bucket_name='your_bucket_name', # необходимо указать имя бакета,
object_name='new_object_name', # имя для нового файла в хринилище
file_path='/files/your_file') # и путь к исходному файлу
# выгрузка объекта из хранилища в ваш файл
client.fget_object(bucket_name='your_bucket_name', # необходимо указать имя бакета,
object_name='your_object_name', # имя файла в хранилище
file_path='/files/temp_file') # и путь к файлу для записи
# пример записи строковых данных в хранилище через поток
import io
str_io_object = io.StringIO('some data in string format') # перевод из строки в поток
data_stream = str_io_object.read().encode('utf8') # считывание потока
client.put_object(bucket_name='bucketname',
object_name='filename',
data=data_stream,
length=len(data_stream))
# пример считывания данных из хранилища через объект
data_object = client.get_object(bucket_name='bucketname',object_name='filename')
# данный метод возвращает urllib3.response.HTTPResponse object
# для получения самих данных необходимо обратиться к атрибуту data
data = data_object.data # в некоторых случаях придется использовать data_object.data.decode()Другие часто используемые методы:
# получение списка метаданных для каждого объекта в бакете,
# в основном используется для получения имен все файлов в бакете
object_list = client.list_objects(bucket_name=bucketname)
for obj in object_list:
print('имя файла: ', obj.object_name,
'размер: ', obj.size,
'дата последнего изменения: ', obj.last_modified) # и т.д.
# удаление объекта по названию
client.remove_object(bucket_name=bucketname, object_name=filename)
# удаление некоторого множества объектов по списку названий
client.remove_objects(bucket_name=bucketname, delete_object_list=['name1', 'name2'])
# получение метаданных конкретного объекта
metadata = client.stat_object(bucket_name=bucketname, object_name=filename)
print('имя файла: ', metadata.object_name,
', размер: ', metadata.size,
', дата последнего изменения: ', metadata.last_modified) # и т.д.Помимо перечисленных существует множество методов для работы с объектами в хранилище: copy, compose, управление тегами и конфигурациями, кодирование и др.
Если вы хотите в Django проекте использовать Minio в качестве хранилища по-умолчанию для всех объектов, тогда можно добавить соответствующие настройки в файле settings.py. Для этого на пустом месте добавьте следующие строки:
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_STORAGE_BUCKET_NAME = 'bucket_name' # Бакет должен уже быть создан
AWS_ACCESS_KEY_ID = 'minio'
AWS_SECRET_ACCESS_KEY = 'minio124'
AWS_S3_ENDPOINT_URL = 'http://127.0.0.1:9000'В противном случае используйте описанные ранее методы
внутри ваших функций без применения дополнительных настроек.
Также советую поменять часовой пояс, чтобы для MinIO и Django
они совпадали. Для этого найдите в конце файла параметр TIME_ZONE:
TIME_ZONE = 'Europe/Moscow'Примеры всех вышеперечисленных функций вы можете посмотреть в файле base_methods.py.
Однако, там они описаны исключительно в познавательных целях и в таком виде непригодны к использованию.
Более приближенный к реальности пример приведен в файле advanced_example.py.
Там функции обернуты в класс, данные для подключения берутся из файла конфигурации,
а также реализована обработка ошибок для minio методов через minio.error.S3Error.
Официальная документация Minio для Python:
https://min.io/docs/minio/linux/developers/python/API.html
Официальная документация по библиотеке io для работы с потоками:
https://docs.python.org/3/library/io.html
Официальная документация по библиотеке configparser для работы с файлами конфигураций:
https://docs.python.org/3/library/configparser.html
Использование Minio для хранения файлов в Django проектах:
https://emackovenko.ru/django-ispolzovanie-obektnogo-khranilishh/
| Back | FazBrowse Home | New Git URL |