Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье показано, как создавать аренды контейнеров и управлять ими с помощью клиентской библиотеки Azure Storage для Python. Клиентскую библиотеку можно использовать для получения, продления, прерывания и освобождения аренды контейнеров.
Сведения об аренде BLOB-контейнера с помощью асинхронных API см. в статье "Аренда контейнеров асинхронно".
Предварительные условия
- Подписка Azure — создайте бесплатную учетную запись.
- Учетная запись хранения Azure — создайте такую учетную запись.
- Python 3.8+
Настройка среды
Если у вас нет существующего проекта, в этом разделе показано, как настроить проект для работы с клиентской библиотекой Хранилище BLOB-объектов Azure для Python. Для получения дополнительных сведений см. статью «Начало работы с Blob-хранилищем Azure и Python».
Чтобы работать с примерами кода в этой статье, выполните следующие действия, чтобы настроить проект.
Установка пакетов
Установите следующие пакеты с помощью pip install
:
pip install azure-storage-blob azure-identity
Добавить инструкции импорта
Добавьте следующие инструкции import
:
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient, BlobLeaseClient
Авторизация
Механизм авторизации должен иметь необходимые разрешения для работы с арендой контейнера. Для авторизации с помощью Microsoft Entra ID (рекомендуется), требуется встроенная роль Участник данных 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)
Также можно создавать клиентские объекты для конкретных контейнеров или объектов BLOB, непосредственно или из объекта BlobServiceClient
. Дополнительные сведения о создании клиентских объектов и управлении ими см. в статье "Создание клиентских объектов и управление ими", взаимодействующих с ресурсами данных.
Сведения об аренде контейнеров
Аренда устанавливает блокировку контейнера для операций удаления и управляет ими. Длительность блокировки может составлять 15–60 секунд либо быть бесконечной. Аренда контейнера предоставляет эксклюзивное право на удаление контейнера. Аренда контейнера управляет только возможностью удаления контейнера с помощью операции REST API удаления контейнера . Для удаления контейнера с активной арендой клиент наряду с запросом на удаление должен ввести активный идентификатор аренды. Все остальные операции с контейнером успешно выполняются без идентификатора аренды на арендованный контейнер. Если вы включили обратимое удаление контейнера, можно восстановить удаленные контейнеры.
Дополнительные сведения о состояниях аренды и о том, когда можно выполнить данное действие по аренде, см. в разделе "Состояния аренды" и действия.
Операции аренды обрабатываются классом BlobLeaseClient, который предоставляет все операции аренды для блобов и контейнеров. Дополнительные сведения об аренде BLOB-объектов с помощью клиентской библиотеки см. в статье "Создание аренды BLOB-объектов и управление ими с помощью Python".
Получение аренды
При получении вами аренды контейнера вы получите идентификатор аренды, который ваш код может использовать для работы с контейнером. Если контейнер уже имеет активную аренду, можно запросить только новую аренду с помощью активного идентификатора аренды. Однако можно указать новую длительность аренды.
Чтобы получить аренду, создайте экземпляр класса BlobLeaseClient , а затем используйте следующий метод:
Вы также можете получить аренду с помощью следующего метода из класса ContainerClient :
Следующий пример получает 30-секундную аренду контейнера:
def acquire_container_lease(self, blob_service_client: BlobServiceClient, container_name):
# Instantiate a ContainerClient
container_client = blob_service_client.get_container_client(container=container_name)
# Acquire a 30-second lease on the container
lease_client = container_client.acquire_lease(30)
return lease_client
Продление аренды
Вы можете продлить аренду контейнера, если идентификатор аренды, указанный в запросе, соответствует идентификатору аренды, связанному с контейнером. Аренда может быть продлена даже в том случае, если срок его действия истек, если контейнер еще не был арендован с момента истечения срока действия этой аренды. При продлении аренды срок аренды сбрасывается.
Чтобы продлить аренду, используйте следующий метод:
В следующем примере возобновляется аренда контейнера:
def renew_container_lease(self, lease_client: BlobLeaseClient):
# Renew a lease on the container
lease_client.renew()
Расторжение договора аренды
Вы можете освободить аренду контейнера, если идентификатор аренды, указанный в запросе, соответствует идентификатору аренды, связанному с контейнером. Освобождение аренды позволяет другому клиенту получить аренду контейнера сразу после завершения выпуска.
Вы можете освободить аренду с помощью следующего метода:
В следующем примере расторгается лизинг контейнера:
def release_container_lease(self, lease_client: BlobLeaseClient):
# Release a lease on the container
lease_client.release()
Прерывание аренды
Вы можете разорвать аренду контейнера, если контейнер имеет активную аренду. Любой авторизованный запрос может прервать аренду; запросу не требуется указывать соответствующий идентификатор аренды. Аренда не может быть продлена после того, как она нарушена, и разрыв аренды предотвращает получение новой аренды в течение определенного периода времени, пока исходная аренда не истекает или не будет освобождена.
Вы можете разорвать аренду с помощью следующего метода:
В следующем примере прерывается аренда контейнера:
def break_container_lease(self, lease_client: BlobLeaseClient):
# Break a lease on the container
lease_client.break_lease()
Аренда контейнеров асинхронно
Клиентская библиотека Azure для работы с BLOB-объектами на языке Python поддерживает асинхронное управление арендой контейнеров. Дополнительные сведения о требованиях к настройке проекта см. в статье асинхронное программирование.
Выполните следующие действия, чтобы арендовать контейнер с помощью асинхронных 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 = ContainerSamples() # 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_container_lease(blob_service_client, "sample-container") if __name__ == '__main__': asyncio.run(main())
Добавьте код для получения аренды контейнера. Код совпадает с синхронным примером, за исключением того, что метод объявляется с
async
ключевым словом, аawait
ключевое слово используется при вызовеacquire
метода.async def acquire_container_lease(self, blob_service_client: BlobServiceClient, container_name): # Instantiate a ContainerClient container_client = blob_service_client.get_container_client(container=container_name) # Acquire a 30-second lease on the container lease_client = BlobLeaseClient(container_client) await lease_client.acquire(lease_duration=30) return lease_client
С помощью этой базовой настройки вы можете реализовать другие примеры в этой статье в качестве корутин с помощью синтаксиса async/await.
Состояния и операции аренды
На следующей схеме показаны пять состояний аренды, а также команды или события, вызывающие изменение состояния аренды.
В следующей таблице перечислены пять состояний аренды, краткое описание каждого из них и список действий аренды, разрешенных в заданном состоянии. Эти действия аренды вызывают переходы состояния, как показано на схеме.
Состояние аренды | Описание | Разрешенные действия аренды |
---|---|---|
Доступно | Аренда разблокирована и может быть приобретена. | acquire |
Арендованный | Аренда заблокирована. |
acquire (один и тот же идентификатор аренды), renew , change , release и break |
Срок действия истек | Срок аренды истек. |
acquire , renew , release и break |
Срочные новости | Аренда была нарушена, но аренда будет по-прежнему заблокирована до истечения периода перерыва. |
release и break . |
Неисправно | Аренда была нарушена, и срок перерыва истек. |
acquire , release и break |
По истечении срока аренды идентификатор аренды сохраняется службой BLOB-хранилища до тех пор, пока контейнер не будет изменён или вновь арендован. Клиент может попытаться продлить или освободить аренду с помощью идентификатора аренды с истекшим сроком действия. Если запрос завершается ошибкой, клиент знает, что контейнер был арендован снова или контейнер был удален с момента последнего активного аренды.
Если срок действия аренды истекает, а не освобождается явным образом, клиенту может потребоваться ждать до одной минуты, прежде чем будет получена новая аренда для контейнера. Однако клиент может немедленно продлить аренду с идентификатором аренды с истекшим сроком действия.
Ресурсы
Дополнительные сведения об аренде контейнера с помощью клиентской библиотеки Azure Blob Storage для Python см. в следующих ресурсах.
Примеры кода
- Просмотр примеров синхронного или асинхронного кода из этой статьи (GitHub)
Операции REST API
Пакет SDK Azure для Python содержит библиотеки, которые создаются на основе REST API Azure, что позволяет взаимодействовать с операциями REST API с помощью знакомых парадигм Python. Методы клиентской библиотеки для аренды контейнера используют следующую операцию REST API:
- Аренда контейнера (REST API)
Ресурсы клиентской библиотеки
См. также
Связанный контент
- Эта статья является частью руководства разработчика хранилища BLOB-объектов для Python. Дополнительные сведения см. в полном списке статей руководства разработчика по созданию приложения Python.