Megosztás a következőn keresztül:


Blobbérletek létrehozása és kezelése a Pythonnal

Ez a cikk bemutatja, hogyan hozhat létre és kezelhet blobbérleteket a Pythonhoz készült Azure Storage-ügyfélkódtár használatával. Az ügyfélkönyvtár használatával blob bérleteket szerezhet be, újíthat meg, bocsáthat ki és szakíthat meg.

A blob aszinkron API-k használatával történő bérbeadásáról további információt a blobok aszinkron bérlete című témakörben talál.

Előfeltételek

Saját környezet beállítása

Ha nem rendelkezik meglévő projekttel, ez a szakasz bemutatja, hogyan állíthat be egy projektet a PythonHoz készült Azure Blob Storage ügyfélkódtár használatához. További részletekért tekintse meg az Azure Blob Storage és a Python használatának első lépéseit.

A jelen cikkben szereplő példakódok használatához kövesse az alábbi lépéseket a projekt beállításához.

Csomagok telepítése

Telepítse a következő csomagokat az pip install használatával:

pip install azure-storage-blob azure-identity

Importálási utasítások hozzáadása

Adja hozzá a következő import-utasításokat:

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient, BlobLeaseClient

Engedélyezés

Az engedélyezési mechanizmusnak rendelkeznie kell a blobbérlet használatához szükséges engedélyekkel. A Microsoft Entra ID használatához történő engedélyezéshez (ajánlott) az Azure RBAC beépített "Storage Blob Data Contributor" szerepkörre vagy magasabb szerepkörre van szükség. További információkért tekintse meg az Lease Blob (REST API) autorizációs útmutatóját.

Ügyfélobjektum létrehozása

Ha egy alkalmazást a Blob Storage-hoz szeretne csatlakoztatni, hozzon létre egy BlobServiceClient-példányt. Az alábbi példa bemutatja, hogyan hozhat létre ügyfélobjektumot DefaultAzureCredential engedélyezés céljából:

# 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)

Ügyfélobjektumokat is létrehozhat adott tárolókhoz vagy blobokhoz közvetlenül vagy az BlobServiceClient objektumból. Az ügyfélobjektumok létrehozásáról és kezeléséről további információt az adaterőforrásokat kezelő ügyfélobjektumok létrehozása és kezelése című témakörben talál.

Tudnivalók a blob bérletről

Egy bérleti szerződés létrehoz és kezel egy blob-zárat az írási és törlési műveletekhez. A zárolás időtartama 15–60 másodperc lehet, vagy végtelen is lehet. Egy blob bérlete kizárólagos írási és törlési hozzáférést biztosít a blobhoz. Ha aktív bérlettel rendelkező blobba szeretne írni, az ügyfélnek tartalmaznia kell az aktív bérlet azonosítóját az írási kérelemmel.

Ha többet szeretne megtudni a bérletállapotokról, és hogy mikor hajthat végre egy adott műveletet egy bérleten, tekintse meg a bérletállapotokat és a műveleteket.

Minden tárolóművelet engedélyezett azon tárolók esetében, amelyek aktív bérlettel rendelkező blobokat tartalmaznak, beleértve a tároló törlése is. Ezért a tároló akkor is törölhető, ha a benne lévő blobok aktív bérletekkel rendelkeznek. A Tárolóbérlet művelettel szabályozhatja a tároló törléséhez szükséges jogosultságokat.

A bérletműveleteket a BlobLeaseClient osztály kezeli, amely egy olyan ügyfelet biztosít, amely a blobok és tárolók összes bérletműveletét tartalmazza. Ha többet szeretne megtudni a tárolóbérletekről az ügyfélkódtár használatával, olvassa el a Tárolóbérletek létrehozása és kezelése a Pythonnal című témakört.

Bérlet beszerzése

Blobbérlet beszerzésekor egy bérletazonosítót kap, amelyet a kód a blobon való működéshez használhat. Ha a blob már rendelkezik aktív bérletekkel, csak az aktív bérletazonosító használatával kérhet új bérletet. Megadhatja azonban az új bérlet időtartamát.

Bérlet beszerzéséhez hozza létre a BlobLeaseClient osztály egy példányát, majd használja a következő módszert:

A blob bérleti szerződését úgy is megszerezheti, hogy létrehoz egy BlobClient példányt, és az alábbi módszert alkalmazza:

Az alábbi példa egy blob 30 másodperces bérletét szerzi be:

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

Bérlet megújítása

Megújíthat egy blobbérletet, ha a kérelemben megadott bérletazonosító megegyezik a blobhoz társított bérletazonosítóval. A bérlet akkor is megújítható, ha lejárt, feltéve, hogy a blobot a bérlet lejárata óta nem módosították vagy bérletezték újra. Amikor megújít egy bérletet, a bérlet időtartama visszaáll.

A bérlet megújításához használja a következő módszert:

Az alábbi példa megújít egy blob típusú objektum bérletét:

def renew_blob_lease(self, lease_client: BlobLeaseClient):
    # Renew a lease on a blob
    lease_client.renew()

Bérlet felszabadítása

Blobbérletet akkor adhat ki, ha a kérelemben megadott bérletazonosító megegyezik a blobhoz társított bérletazonosítóval. A bérlet felszabadítása lehetővé teszi, hogy egy másik ügyfél közvetlenül a kiadás befejezése után megszerezze a blob bérletét.

A bérletet a következő módszerrel oldhatja fel:

Az alábbi példa feloldja a blob bérletét.

def release_blob_lease(self, lease_client: BlobLeaseClient):
    # Release a lease on a blob
    lease_client.release()

Bérlet megszakítása

Megszakíthatja a blob bérleti szerződését, ha a blobnak aktív bérlete van. Bármilyen engedélyezett kérelem felmondhatja a bérletet; a kérelemhez nem szükséges egyező bérletazonosítót megadni. A bérletek nem újíthatók meg a szerződés megszakadása után, és a bérlet feltörése megakadályozza az új bérlet beszerzését egy ideig, amíg az eredeti bérlet lejár vagy fel nem szabadul.

A bérletet a következő módszerrel szakíthatja meg:

Az alábbi példa felbontja egy blob bérletét.

def break_blob_lease(self, lease_client: BlobLeaseClient):
    # Break a lease on a blob
    lease_client.break_lease()

Blobok aszinkron bérlete

A Pythonhoz készült Azure Blob Storage ügyfélkódtár aszinkron módon támogatja a blobok bérbeadását. A projektbeállítási követelményekről további információt az Aszinkron programozás című témakörben talál.

A blob aszinkron API-k használatával történő bérletéhez kövesse az alábbi lépéseket:

  1. Adja hozzá a következő importálási utasításokat:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobLeaseClient
    
  2. Adja hozzá a kódot a program futtatásához a következő használatával: asyncio.run. Ez a függvény a példánkban futtatja az átadott koroutint, main() és kezeli az asyncio eseményhurokot. A korutinok az async/await szintaxissal vannak deklarálva. Ebben a példában a main() coroutine először létrehozza a felső szint BlobServiceClient a async with használatával, majd meghívja a metódust, amely megszerzi a blob bérlését. Vegye figyelembe, hogy csak a legfelső szintű ügyfélnek kell használnia async with, mivel az abból létrehozott többi ügyfél ugyanazt a kapcsolatkészletet használja.

    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())
    
  3. Adjon hozzá kódot a blobbérlet megszerzéséhez. A kód megegyezik a szinkron példával, azzal a kivétellel, hogy a metódus a kulcsszóval async van deklarálva, és a await kulcsszót a metódus meghívásakor használja a acquire_lease rendszer.

    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
    

Ezzel az alapszintű beállítással a cikkben más példákat is implementálhat coroutinesként az aszinkron/várakozási szintaxis használatával.

Bérletállapotok és műveletek

Az alábbi ábra egy bérlet öt állapotát, valamint a bérletállapot-módosításokat okozó parancsokat vagy eseményeket mutatja be.

Diagram a blob bérleti állapotokról és az állapotváltozások kiváltóiról.

Az alábbi táblázat felsorolja az öt bérletállapotot, rövid leírást ad mindegyikről, és felsorolja az adott állapotban engedélyezett bérletműveleteket. Ezek a bérletműveletek állapotváltásokat okoznak, ahogy az a diagramon is látható.

Bérlet állapota Leírás Bérletműveletek engedélyezettek
Elérhető A bérlet feloldva van, és beszerezhető. acquire
Bérelt A bérlet zárolva van. acquire (csak ugyanaz a bérletazonosító), renew, change, releaseés break
Lejárt A bérlet időtartama lejárt. acquire, renew, releaseés break
Rendkívüli hírek A bérlet megszakadt, de a bérlet a megszakítási időszak lejártáig zárolva marad. release és break
Törött A bérlet megszakadt, és a megszakítási időszak lejárt. acquire, releaseés break

Ha egy bérlet lejár, a blobszolgáltatás a bérletazonosítót addig tartja karban, amíg a blobot nem módosítják vagy újra nem bérletelik. Az ügyfél megkísérelheti megújítani vagy felszabadítani a bérletet a lejárt bérletazonosító használatával. Ha ez a művelet sikeres, az ügyfél tudja, hogy a blob nem módosult a bérletazonosító utolsó érvényességétől kezdve. Ha a kérés meghiúsul, az ügyfél tudja, hogy a blob módosult, vagy a blobot ismét bérletbe adták, mivel a bérlet utoljára aktív volt. Az ügyfélnek ezután új bérelési engedélyt kell szereznie a blobra.

Ha egy bérlet lejár ahelyett, hogy explicit módon fel lett volna szabadítva, előfordulhat, hogy az ügyfélnek akár egy percet is várnia kell, mielőtt új bérletet szerezhet be a blob számára. Az ügyfél azonban azonnal megújíthatja a bérletet a bérletazonosítójával, ha a blobot nem módosították.

A blobok pillanatképeihez nem adható bérlet, mivel a pillanatképek írásvédettek. Amikor bérletet kérsz egy pillanatképhez, az 400 (Bad Request) státuszkódot eredményez.

Források

Ha többet szeretne megtudni a blobbérletek Pythonhoz készült Azure Blob Storage-ügyfélkódtár használatával történő kezeléséről, tekintse meg az alábbi erőforrásokat.

Kódminták

REST API-műveletek

Az Azure SDK for Python olyan kódtárakat tartalmaz, amelyek az Azure REST API-ra épülnek, lehetővé téve a REST API-műveletek használatát jól ismert Python-paradigmákon keresztül. A blobbérletek kezelésére szolgáló ügyfélkódtár-metódusok a következő REST API-műveletet használják:

Ügyfélkódtár erőforrásai

Lásd még