praktikum 8 - Pilveandmebaaside kasutamine Veebiteenuste loomisel: Azure Blob Storage
Selles praktikumis kasutame Azure pilveandmete salvestamise teenust - Azure Blob Storage. Me võtame oma neljanda praktikumi REST API programmi, ning muudame seda nii, et raamatute sisu salvestamiseks ei kasutata enam lokaalset failisüsteemi, vaid hoopis hoiame failid Azure pilveplatvormis.
Viited
- azure-storage-blob Package - https://docs.microsoft.com/en-us/python/api/azure-storage-blob/?view=azure-python
- Pythoni azure-storage-blob õpetus: https://docs.microsoft.com/en-us/azure/developer/python/sdk/storage/storage-blob-readme?view=storage-py-v12
Probleemide korral kontrollige:
- Võimalikud probleemid ja nende potentsiaalsed lahendused osa praktikumi juhendi lõpus.
- Küsige otse
#praktikum-8-blob
Zulip teemas.- Ka siis kui soovite lihtsalt viheid.
Ülesanne 8.1: Azure Blob teenuse konfigureerimine
Selles ülesandes konfigureerimine Azure Blob teenuse, loome uue näite konteineri failide hoidmiseks, loome uued Azure Blob objektid ning vaatame kuidas ligi pääseda Azure Blob teenuse autentimise infole, mida meie rakendus hiljem vajab Azure pilve API kasutamiseks.
- Avage Azure Cloudi portaal: https://portal.azure.com/#home
- Tehke endale uus Azure Storage konto
- Regiooniks on soovitav valida: North Europe
- Peale eduka konto loomist, saate avada oma Azure Storage resursi lehe ning klikkida lingil
Blob Service
- Sellel lehel saate vaadata hetkel loodud Azure Storage Blob konteinereid ning saate nendes leiduvate failide sisu vaadata ja vajadusel faile kustutada.
- Looge veebiliidese kaudu uus Azure Blob konteiner, ning laadige sinna üles mõni tekstifail. Uurige, kas ja kuidas saate üles laetud faili sisu vaadata ning muuta.
- Avage uuesti Storage account ressursi vaade ning valige vasakus ääre menüüs
Access Keys
link Security + networking grupis. - Kopeerige endale sealt väärtused:
Key
jaConnection string
- Neid läheb hiljem meie loodavas programmis vaja.
- Tehke ekraanivaade brauserist, kus on näha loodud Azure blob faili sisu.
Ülesanne 8.2: Loome Python meetodid raamatute failide haldamiseks Azure blob objektidena
Selles ülesandes loome uued Python meetodid Azure blob andmehoidla operatioonide kasutamiseks selleks, et luua uusi blob objekte, nende nimekirja näha, objekte alla tõmmata ning kustutada.
- Võtke aluseks oma Neljas praktikum - RESTful APIde loomine loodud API programm.
- Tehke sellest Python projektist koopia ning edaspidi lisame sellesse programmi uued meetodid ning muudame kuidas meie poolt loodud API meetodid sisemiselt töötavad.
- Improdime Azure blob API
- Installeerige
azure-storage-blob
Pythoni pakett.- NB! kindlasti ärge installeerige terve
azure
Pythoni pakett. Muidu saate liiga vanaazure-storage-blob
teegi versiooni.
- NB! kindlasti ärge installeerige terve
- Lisage teegi importimise käsk:
from azure.storage.blob import BlobServiceClient
faili algusesse
- Installeerige
- Lisame Azure Blob teenusega seotud ühenduse loomise info ja koodi programmi
'__main__'
blokki:blob_connection_string = os.getenv('AZURE_BLOB_CONNECTION_STRING') blob_service_client = BlobServiceClient.from_connection_string(blob_connection_string) blob_container_name = ""
- Pange
blob_container_name
muutuja väärtuseks endale sobiv konteineri nimi, aga see võiks sisaldada teie perekonna nime (ilma spetsiaalsete tähtede või muude karakteriteta). - Loome keskkonna muutuja AZURE_BLOB_CONNECTION_STRING programmist väljaspool.
-
AZURE_BLOB_CONNECTION_STRING
muutuja väärtuseks paneme arem salvestatud Azure blob ressursi Connection string väärtus. - NB! Üldjuhul on väga halb sellise info programmi sisse kirjutamist, kuna siis võib autentimise info lihtsasti lekkida.
- Parem lahendus on lugeda sellised väärtused Süsteemi keskkonna muutujate kaudu.
- Seda saab teha käsurealt enne programmi jooksutamist Või PyCharm Run Configuration kaudu
- Windows PowerShellis:
$env:AZURE_BLOB_CONNECTION_STRING = "..................."
- Linux:
export AZURE_BLOB_CONNECTION_STRING="................."
- PyCharm:
Run Configuration
muutmise vaates, lisage uus väärtusEnviorenment variables
all
- Windows PowerShellis:
-
- Pange
- Loome järgnevad uued Python meetodid ning lisame need programmi algusesse, peale Python teekide importimise käskusid:
- Loome
def blob_konteineri_loomine(konteineri_nimi):
meetodi uue Azure blob konteineri loomiseks- Looge uus KONTEINERI kliendi objekt meetodi sees:
container_client = blob_service_client.get_container_client(container=konteineri_nimi)
- Kontrollige kas konteiner juba eksisteerib (
container_client.exists())
) - Kui eksisteeri, siis looge uus konteiner (
blob_service_client.create_container(konteineri_nimi)
)
- NB! Kutsuge see meetod välja
blob_konteineri_loomine(blob_container_name)
programmi__main__
bloki sees.
- Looge uus KONTEINERI kliendi objekt meetodi sees:
- Loome
def blob_raamatute_nimekiri():
meetodi Azure blob konteineri siseste objektide nimekirja tagastamiseks.- Sarnaselt eelnevale, looge uus KONTEINERI kliendi objekt meetodi sees. (Konteineri nimena saate kasutada muutujat blob_container_name)
- konteineri objektide listi saate käsu
container_client.list_blobs()
kaudu- konteineri objekti seest saab BLob objekti nime kätte nii:
blob.name
- kuiblob
on konkreetse Blob'i Python'i objekt.
- konteineri objekti seest saab BLob objekti nime kätte nii:
- Meetod peaks tagastama raamatute objektide nimede nimekirja, mis on salvestatud konteinerisse.
- Loome
blob_alla_laadimine(faili_nimi)
meetodi Azure blob objekti/faili SISU alla laadimiseks konteinerist.- Meetod peab tagastama faili sisu tekstina.
- Looge uus BLOB kliendiobjekt meetodi sees:
blob_client = blob_service_client.get_blob_client(container=blob_container_name, blob=faili_nimi)
- blob sisu (content) saab kätte meetodi
blob_client.download_blob().content_as_text()
abil
- Loome
blob_ules_laadimine_sisu(faili_nimi, sisu)
meetodi uue Azure blob objekti/faili loomiseks, ehk üles laadimiseks konteinerisse.- Sarnaselt eelnevale, looge uus BLOB kliendi objekt meetodi sees
- Meetodi argumendiks peaks olema faili sisu tekst tüüpi (string) väärtusena
- Blob objekti saab luua meetodi
blob_client.upload_blob(sisu)
abil.
- Loome
blob_kustutamine(faili_nimi)
meetodi uue Azure blob objekti/faili alla laadimiseks konteinerist.- Sarnaselt eelnevale, looge uus BlOB kliendi objekt meetodi sees
- Blob objekti saab kustutada meetodi
blob_client.delete_blob()
abil
Iseseisev ülesanne:
- Testige, et õnnestub loodud meetodite abil:
- Uus konteiner luua
- Blob luua (enda poolt valitud nime ning sisuga) konteineris
- Blob'ide listimine konteineris
- Blob alla tõmmata ning sisu välja printida
- Blob kustutada
- Testimist võib teha eraldi programmi sees, või lihtsalt rakenduse
__main__
bloki sees - Me kasutame neid meetodeid järgmises ülesandes meie neljandas praktikumis loodud REST API meetodite sees, et asendada failide salvestamine lokaalsesse failisüsteemi Azure blob teenuse kasutamisega failide salvestamiseks ja haldamiseks.
Ülesanne 8.3: Rest API modifitseerimine Azure blob meetodeid kasutama
Selles ülesandes modifitseeime oma varasemat REST API rakendust, et vahetada välja raamatute hoidmine lokaalses failisüsteemis Azure blob storage kasutamisega.
- Muudame ära kõikide varasemate Flask API meetodid (mis pärinevad teie praktikumi 4 lahenduse koodist), nii, et lokaalse faili süsteemi kasutamise asemel kasutatakse Azure blob teenuse meetodeid, mida me kirjutasime eelmises ülesandes.
- Selle ülesande käigus peaks jookvmalt eemaldama (asendama) kõik ebavajalikud koodi osad, mis tegelevad lokaalsete kaustade (raamatute_kaust), kaustast otsimise, failide loomise ja failist lugemisega.
GET /raamatud/<book_id>
API meetodi sees peaks kasutamablob_alla_laadimine( book_id)
meetodit raamatu sisu kätte saamiseks.- PS! Pange
blob_alla_laadimine
meetodi väljakutse Pythontry:
bloki sisse. Ning kui tekib viga (Exception), siis see API meetod võiks (except:
blokki sees) tagastada 404 HTTP koodi (return ({}, 404)
) API väljakutse tulemusena - Eemaldage kood, mis ei ole enam vajalik (Lokaalse faili lugemine raamatute kaustast), kuna nüüd küsitakse raamatu sisu Azure Blob teenusest
- NB! Enam ei kasuta raamatu sisu tagastamiseks
send_file()
meetodit, vaid tagastame faili sisu tekstina otse.- Aga selleks, et brauser näitaks raamatu faili korrektselt, oleks nüüd vaja panna paika ka
Content-type
päise väärtus. Seda saab teha meetodireturn
käsu kolmanda argumendi kaudu nii: return (raamatu_sisu, 200, {'Content-Type': 'text/plain; charset=utf-8'})
- Aga selleks, et brauser näitaks raamatu faili korrektselt, oleks nüüd vaja panna paika ka
- PS! Pange
DELETE /raamatud/<book_id>
API meetodi sees peaks kasutamablob_kustutamine(book_id)
meetodit Blob objekti kustutamiseks- PS! Kui tekib viga, siis võiks tagastada 404 HTTP koodi.
GET /raamatud
API meetodi sees peaks kasutamablob_raamatute_nimekiri()
meetodit raamatute nimekirja saamiseks.POST /raamatud
API meetodi sees peaks kasutamablob_ules_laadimine_sisu(book_id, sisu)
meetodit uue Blob loomiseks ning raamatu sisu sinna üles laadimiseks.- PS! Kui tekib viga, siis võiks tagastada veateate ja koodi selle kohta, et raamat juba eksisteerib.
POST /raamatu_otsing
API meetodi sees peaks kasutamablob_alla_laadimine(raamatu_id)
meetodit raamatu sisu alla laadimiseks ning sealt seest määratud sõne otsimiseks.
Ülesanne 8.4: Lahenduse testimine.
Selles ülesandes kontrollime üle, et meie lahendus töötab ilma probleemideta.
NB! Programmi __main__
meetodis peaks rakenduse tööle panemine, näiteks: app.run(debug=True)
olema kõige viimane rida.
- Proovige läbi kõik viist REST API meetodit käsurealt või brauseri kaudu (Get päringute puhul)
- Näiteks Linuksis terminalis
curl
abil või Windowsis PowerShell kaudu. Vaadake näiteid Neljandast praktikumist, kuidas me neid API käske läbi proovisime PowerShell abil.
- Näiteks Linuksis terminalis
- tehke iga meetodi proovimise ja saadud vastuse kohta üks ekraanivaade (kokku 5).
Lahenduse esitamine
Praktikumi lahendusena tuleb esitada:
- Python kood ülesande 8.3 järel
- Ekraanivaated ülesandest 8.1 ja 8.4 (Kokku peaks olema 6).
Võimalikud probleemid ja nende potentiaalsed lahendused.
- Kasutage Flask Debug mode'i, et näga vigasid:
- Koodist:
app.run(debug=True)
- Käsurealt
flask ... --debug
- Koodist:
- Programmi
__main__
meetodis peaks rakenduse tööle panemine, näiteks:app.run(debug=True)
olema kõige viimane rida.