Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этой статье показано, как создавать аренды контейнеров и управлять ими с помощью клиентской библиотеки 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, непосредственно или из объекта . Дополнительные сведения о создании клиентских объектов и управлении ими см. в статье "Создание клиентских объектов и управление ими", взаимодействующих с ресурсами данных.
Сведения об аренде контейнеров
Аренда устанавливает блокировку контейнера для операций удаления и управляет ими. Длительность блокировки может составлять 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.