Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этой статье показано, как создавать и управлять арендой BLOB-объектов с использованием клиентской библиотеки Azure Storage для Python. Используйте клиентскую библиотеку для получения, продления, освобождения и разрыва аренды BLOB-объектов.
Чтобы узнать о том, как взять в аренду большой двоичный объект с помощью асинхронных интерфейсов API, см. "Аренда BLOB-объектов" асинхронно.
Prerequisites
- Подписка Azure — создайте бесплатную учетную запись.
- Учетная запись хранения Azure — создайте такую учетную запись.
- Python 3.8+
Настройка среды
Если у вас нет существующего проекта, в этом разделе показано, как настроить проект для работы с клиентской библиотекой Хранилище BLOB-объектов Azure для Python. Дополнительные сведения см. в разделе "Начало работы с Azure Blob Storage и Python".
Чтобы работать с примерами кода в этой статье, выполните следующие действия, чтобы настроить проект.
Установка пакетов
Установите следующие пакеты с помощью pip install:
pip install azure-storage-blob azure-identity
Добавьте инструкции импорта
Добавьте следующие утверждения import :
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient, BlobLeaseClient
Authorization
Механизм авторизации должен иметь необходимые разрешения для работы с арендой BLOB-объектов. Для авторизации с использованием Microsoft Entra ID (рекомендуется) требуется встроенная роль Azure RBAC Storage Blob Data Contributor или более высокая. Дополнительные сведения см. в руководстве по авторизации для BLOB-объекта аренды (REST API).
Создание клиентского объекта
Чтобы подключить приложение к хранилищу BLOB-объектов, создайте экземпляр BLOBServiceClient. В следующем примере показано, как создать клиентский объект с помощью DefaultAzureCredential авторизации:
# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()
# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential=credential)
Можно также создавать клиентские объекты для определенных контейнеров или блобов, как напрямую, так и с помощью объекта BlobServiceClient. Дополнительные сведения о создании клиентских объектов и управлении ими см. в статье "Создание клиентских объектов и управление ими", взаимодействующих с ресурсами данных.
Сведения об аренде объектов BLOB
Лизинг создает и управляет блокировкой блоба для операций записи и удаления. Длительность блокировки может составлять 15–60 секунд либо быть бесконечной. Аренда большого двоичного объекта обеспечивает монопольный доступ на запись и удаление большого двоичного объекта. Чтобы записать в BLOB с активной арендой, клиент должен включить активный идентификатор аренды с запросом записи.
Дополнительные сведения о состояниях аренды и о том, когда можно выполнить данное действие по аренде, см. в разделе "Состояния аренды" и действия.
Все операции с контейнером разрешены для контейнера, который содержит большие двоичные объекты с активной арендой, в том числе удаление контейнера. Поэтому контейнер может быть удален даже в случае наличия в нем активных аренды блобов. Используйте операцию "Контейнер аренды " для управления правами на удаление контейнера.
Операции удержания обрабатываются классом BlobLeaseClient, который предоставляет все операции удержания для клиента блобов и контейнеров. Дополнительные сведения об аренде контейнеров с помощью клиентской библиотеки см. в статье "Создание аренды контейнеров и управление ими с помощью Python".
Получение аренды
При получении аренды BLOB-объекта вы получите идентификатор аренды, который ваш код может использовать для работы с этим объектом. Если большой двоичный объект уже имеет активную аренду, можно запросить только новую аренду с помощью активного идентификатора аренды. Однако можно указать новую длительность аренды.
Чтобы получить аренду, создайте экземпляр класса BlobLeaseClient , а затем используйте следующий метод:
Вы также можете получить аренду блоба, создав экземпляр BlobClient и используя следующий метод:
Следующий пример получает 30-секундную аренду для объекта blob:
def acquire_blob_lease(self, blob_service_client: BlobServiceClient, container_name):
# Instantiate a BlobClient
blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt")
# Acquire a 30-second lease on the blob
lease_client = blob_client.acquire_lease(30)
return lease_client
Продление аренды
Вы можете продлить аренду BLOB, если идентификатор аренды, указанный в запросе, соответствует связанному с ним идентификатору. Аренда может быть продлена даже в том случае, если срок её действия истек, если большой двоичный объект не был изменён или арендован снова после истечения аренды. При продлении аренды срок аренды обновляется.
Чтобы продлить аренду, используйте следующий метод:
В следующем примере возобновляется аренда блоба:
def renew_blob_lease(self, lease_client: BlobLeaseClient):
# Renew a lease on a blob
lease_client.renew()
Прекращение аренды
Вы можете освободить аренду BLOB, если идентификатор аренды, указанный в запросе, соответствует идентификатору аренды, связанному с BLOB. Освобождение аренды позволяет другому клиенту получить аренду блоба сразу после того, как аренда будет освобождена.
Вы можете освободить аренду с помощью следующего метода:
В следующем примере освобождается аренда BLOB:
def release_blob_lease(self, lease_client: BlobLeaseClient):
# Release a lease on a blob
lease_client.release()
Прерывание аренды
Вы можете прервать аренду BLOB, если у большого двоичного объекта есть активная аренда. Любой авторизованный запрос может прервать аренду; запрос не обязан указывать соответствующий идентификатор аренды. Аренда не может быть продлена после того, как она нарушена, и разрыв аренды предотвращает получение новой аренды в течение определенного периода времени, пока исходная аренда не истекает или не будет освобождена.
Вы можете разорвать аренду с помощью следующего метода:
Здесь показан пример, как прервать аренду BLOB:
def break_blob_lease(self, lease_client: BlobLeaseClient):
# Break a lease on a blob
lease_client.break_lease()
Асинхронная аренда BLOB-объектов
Клиентская библиотека хранилища BLOB-объектов Azure для Python поддерживает асинхронную аренду BLOB-объектов. Дополнительные сведения о требованиях к настройке проекта см. в статье асинхронное программирование.
Выполните следующие действия, чтобы арендовать blob с помощью асинхронных API:
Добавьте в файл следующие инструкции импорта:
import asyncio from azure.identity.aio import DefaultAzureCredential from azure.storage.blob.aio import BlobServiceClient, BlobLeaseClientДобавьте код для запуска программы с помощью
asyncio.run. Эта функция запускает переданную корутинуmain()и управляет циклом событийasyncioв нашем примере. Объявление корутин происходит с использованием синтаксиса async/await. В этом примереmain()корутина сначала создает верхний уровеньBlobServiceClientс помощьюasync with, а затем вызывает метод, который получает аренду двоичного объекта. Обратите внимание, что только клиент верхнего уровня должен использоватьasync with, так как другие клиенты, созданные из него, используют тот же пул подключений.async def main(): sample = BlobSamples() # TODO: Replace <storage-account-name> with your actual storage account name account_url = "https://<storage-account-name>.blob.core.windows.net" credential = DefaultAzureCredential() async with BlobServiceClient(account_url, credential=credential) as blob_service_client: lease_client = await sample.acquire_blob_lease(blob_service_client, "sample-container") if __name__ == '__main__': asyncio.run(main())Добавьте код для получения аренды BLOB-объектов. Код совпадает с синхронным примером, за исключением того, что метод объявляется с
asyncключевым словом, аawaitключевое слово используется при вызовеacquire_leaseметода.async def acquire_blob_lease(self, blob_service_client: BlobServiceClient, container_name): # Instantiate a BlobClient blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt") # Acquire a 30-second lease on the blob lease_client = await blob_client.acquire_lease(30) return lease_client
С помощью этой базовой настройки вы можете реализовать другие примеры в этой статье в качестве корутин с помощью синтаксиса async/await.
Состояния аренды и действия
На следующей схеме показаны пять состояний аренды, а также команды или события, вызывающие изменение состояния аренды.
В следующей таблице перечислены пять состояний аренды, краткое описание каждого из них и список действий аренды, разрешенных в заданном состоянии. Эти действия аренды вызывают переходы состояния, как показано на схеме.
| Состояние аренды | Description | Разрешенные действия аренды |
|---|---|---|
| Available | Аренда разблокирована и может быть приобретена. | acquire |
| Leased | Аренда заблокирована. |
acquire (один и тот же идентификатор аренды), renew, change, releaseи break |
| Expired | Срок аренды истек. |
acquire, renew, release и break |
| Breaking | Аренда была нарушена, но аренда будет по-прежнему заблокирована до истечения периода перерыва. |
release и break. |
| Broken | Аренда была нарушена, и срок перерыва истек. |
acquire, release и break |
По истечении срока аренды идентификатор аренды сохраняется службой Blob до тех пор, пока блоб не будет изменен или арендован снова. Клиент может попытаться продлить или освободить аренду с помощью идентификатора аренды с истекшим сроком действия. Если эта операция выполнена успешно, клиент точно знает, что большой двоичный объект не был изменен с момента, когда идентификатор аренды был последним действительным. Если запрос завершается ошибкой, клиент знает, что BLOB был изменен, или BLOB был арендован снова с момента последней активности аренды. Затем клиент должен получить новый lease на объект BLOB.
Если срок действия аренды истекает, а не освобождается явным образом, клиенту, возможно, придется подождать до одной минуты, прежде чем будет получена новая аренда для объекта блоба. Тем не менее клиент может немедленно продлить аренду, используя свой идентификатор аренды, если объект BLOB не был изменен.
Аренда не может быть предоставлена для моментального снимка blob-объекта, так как моментальные снимки являются доступными только для чтения. Запрос аренды для моментального снимка приводит к коду 400 (Bad Request) состояния.
Resources
Дополнительные сведения об управлении арендой BLOB-объектов с помощью клиентской библиотеки хранилища BLOB-объектов Azure для Python см. в следующих ресурсах.
Примеры кода
- Просмотр примеров синхронного или асинхронного кода из этой статьи (GitHub)
Операции REST API
Пакет SDK Azure для Python содержит библиотеки, которые создаются на основе REST API Azure, что позволяет взаимодействовать с операциями REST API с помощью знакомых парадигм Python. Методы клиентской библиотеки для управления арендами BLOB-объектов используют следующую операцию REST API:
Ресурсы клиентской библиотеки
См. также
Связанный контент
- Эта статья является частью руководства разработчика хранилища BLOB-объектов для Python. Дополнительные сведения см. в полном списке статей руководства разработчика по созданию приложения Python.