Institute of Computer Science
  1. Courses
  2. 2023/24 spring
  3. Development of web services and distributed systems (LTAT.06.018)
ET
Log in

Development of web services and distributed systems 2023/24 spring

  • Pealeht
  • Loengud
  • Praktikumid
  • Lahenduste Esitamine

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

  1. azure-storage-blob Package - https://docs.microsoft.com/en-us/python/api/azure-storage-blob/?view=azure-python
  2. 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:

  1. Võimalikud probleemid ja nende potentsiaalsed lahendused osa praktikumi juhendi lõpus.
  2. 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 ja Connection 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.

  1. 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 vana azure-storage-blob teegi versiooni.
    • Lisage teegi importimise käsk: from azure.storage.blob import BlobServiceClient faili algusesse
  • 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äärtus Enviorenment variables all
  • Loome järgnevad uued Python meetodid ning lisame need programmi algusesse, peale Python teekide importimise käskusid:
  1. 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.
  2. 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 - kui blob on konkreetse Blob'i Python'i objekt.
    • Meetod peaks tagastama raamatute objektide nimede nimekirja, mis on salvestatud konteinerisse.
  3. 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
  4. 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.
  5. 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:
    1. Uus konteiner luua
    2. Blob luua (enda poolt valitud nime ning sisuga) konteineris
    3. Blob'ide listimine konteineris
    4. Blob alla tõmmata ning sisu välja printida
    5. 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.
  1. GET /raamatud/<book_id> API meetodi sees peaks kasutama blob_alla_laadimine( book_id) meetodit raamatu sisu kätte saamiseks.
    • PS! Pange blob_alla_laadimine meetodi väljakutse Python try: 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 meetodi return käsu kolmanda argumendi kaudu nii:
      • return (raamatu_sisu, 200, {'Content-Type': 'text/plain; charset=utf-8'})
  2. DELETE /raamatud/<book_id> API meetodi sees peaks kasutama blob_kustutamine(book_id) meetodit Blob objekti kustutamiseks
    • PS! Kui tekib viga, siis võiks tagastada 404 HTTP koodi.
  3. GET /raamatud API meetodi sees peaks kasutama blob_raamatute_nimekiri() meetodit raamatute nimekirja saamiseks.
  4. POST /raamatud API meetodi sees peaks kasutama blob_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.
  5. POST /raamatu_otsing API meetodi sees peaks kasutama blob_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.
  • tehke iga meetodi proovimise ja saadud vastuse kohta üks ekraanivaade (kokku 5).

Lahenduse esitamine

Praktikumi lahendusena tuleb esitada:

  1. Python kood ülesande 8.3 järel
  2. Ekraanivaated ülesandest 8.1 ja 8.4 (Kokku peaks olema 6).
You must be logged in and registered to the course in order to submit solutions.

Võimalikud probleemid ja nende potentiaalsed lahendused.

  1. Kasutage Flask Debug mode'i, et näga vigasid:
    • Koodist: app.run(debug=True)
    • Käsurealt flask ... --debug
  2. Programmi __main__ meetodis peaks rakenduse tööle panemine, näiteks: app.run(debug=True) olema kõige viimane rida.
  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment