Toto je nadväzujúce praktické cvičenie, ktoré priamo nadväzuje na predchádzajúci lab. Uistite sa, že máte pripravenú Flask webovú aplikáciu.
Tento lab predstavuje:
- Azure SQL Database (relačná databáza)
- Reťazce pripojenia k databáze
- Integrácia Flask s relačnou databázou
- Základné CRUD operácie
Po skončení tohto labu budete vedieť:
- Vytvoriť Azure SQL Database
- Nakonfigurovať prístup cez firewall
- Pripojiť Flask k relačnej databáze
- Ukladať a načítavať dáta
- Bezpečne používať premenné prostredia
- Znovu nasadiť a otestovať aplikáciu s databázou
1 Vytvorenie Azure SQL Database
Relačná databáza ukladá dáta v tabuľkách. Používa riadky a stĺpce a vynucuje vzťahy medzi nimi.
Príklad tabuľky:
| id | meno |
|---|---|
| 1 | Alice |
| 2 | Bob |
Azure SQL Database je spravovaná služba relačnej databázy. Je založená na Microsoft SQL Serveri.
Výhody:
- Vysoká dostupnosť
- Automatické zálohy
- Bezpečný cloudový prístup
- Škálovateľnosť
Vytvorte SQL Server príkazom:
az sql server create \
--name <unique-sql-server-name> \
--resource-group <resource-group> \
--location westeurope \
--admin-user sqladmin \
--admin-password <StrongPassword123!>
Heslo musí spĺňať požiadavky Azure na zložitosť hesla.
Potom vytvorte SQL databázu:
az sql db create \
--resource-group <resource-group> \
--server <unique-sql-server-name> \
--name studentdb \
--service-objective Basic
Je potrebné nakonfigurovať firewall, aby umožnil prístup iným službám Azure:
az sql server firewall-rule create \
--resource-group <resource-group> \
--server <unique-sql-server-name> \
--name AllowAzureServices \
--start-ip-address 0.0.0.0 \
--end-ip-address 0.0.0.0
Toto pravidlo umožňuje vašej Azure Web App pripojiť sa k databáze. Viac informácií o Azure Firewall nájdete v tomto návode.
2 Úprava Flask aplikácie
Po tom, čo je databáza pripravená a spustená, môžete upraviť webovú aplikáciu na používanie relačnej databázy:
V priečinku projektu nainštalujte závislosti pre databázu:
pip install pyodbc sqlalchemy
Poznámka:
pyodbcvyžaduje aj inštaláciu Microsoft ODBC Driver for SQL Server na úrovni systému. Pozrite si oficiálny inštalačný návod pre váš operačný systém.
Aktualizujte závislosti:
pip freeze > requirements.txt
Pridajte kód, ktorý používa sqlalchemy na zápis a čítanie dát z databázy.
Databáza je konfigurovaná pomocou premennej prostredia.
Nahraďte existujúci súbor app.py týmto kódom:
from flask import Flask, request
from sqlalchemy import create_engine, text
import os
app = Flask(__name__)
# Získanie reťazca pripojenia z premennej prostredia
DATABASE_URL = os.environ.get("DATABASE_URL")
if not DATABASE_URL:
raise RuntimeError("DATABASE_URL environment variable is not set")
engine = create_engine(DATABASE_URL)
@app.route("/")
def home():
return "Database connected Flask App"
@app.route("/init")
def init_db():
with engine.connect() as conn:
conn.execute(text("""
IF OBJECT_ID('students', 'U') IS NULL
CREATE TABLE students (
id INT PRIMARY KEY IDENTITY(1,1),
name VARCHAR(100)
)
"""))
conn.commit()
return "Table created!"
@app.route("/add/<name>")
def add_student(name):
with engine.connect() as conn:
conn.execute(text("INSERT INTO students (name) VALUES (:name)"), {"name": name})
conn.commit()
return f"Added {name}"
@app.route("/students")
def list_students():
with engine.connect() as conn:
result = conn.execute(text("SELECT name FROM students"))
students = [row[0] for row in result]
return "<br>".join(students)
if __name__ == "__main__":
app.run()
3 Konfigurácia aplikácie na používanie reťazca pripojenia k databáze
Musíte zistiť reťazec pripojenia k vašej databáze.
Zvyčajne vyzerá takto:
mssql+pyodbc://username:password@server.database.windows.net:1433/studentdb?driver=ODBC+Driver+17+for+SQL+Server
Napríklad:
mssql+pyodbc://sqladmin:StrongPassword123!@myserver.database.windows.net:1433/studentdb?driver=ODBC+Driver+17+for+SQL+Server
TODO: Ako nájsť reťazec pripojenia k databáze? (Nápoveď: Azure Portal → SQL Database → Connection strings)
Po zistení reťazca pripojenia nastavte premennú prostredia:
az webapp config appsettings set \
--name <webapp-name> \
--resource-group <resource-group> \
--settings DATABASE_URL="<your-connection-string>"
Toto bezpečne uloží prihlasovacie údaje v Azure.
Tip pre lokálne testovanie: Na testovanie pred nasadením nastavte premennú vo vašom shelli:
export DATABASE_URL="<your-connection-string>"
4 Opätovné nasadenie a testovanie aplikácie
az webapp up
Otvorte:
https://<webapp-name>.azurewebsites.net/init
Potom pridajte študentov:
https://<webapp-name>.azurewebsites.net/add/Alice
https://<webapp-name>.azurewebsites.net/add/Bob
Vypísanie zoznamu študentov:
https://<webapp-name>.azurewebsites.net/students
Mali by ste vidieť:
Alice
Bob
Môžete tiež sledovať logy aplikácie:
az webapp log tail \
--name <webapp-name> \
--resource-group <resource-group>
Upratanie
Nezabudnite odstrániť aplikáciu, aby ste ušetrili kredit.
az group delete --name <resource-group> --yes --no-wait
Bonusové úlohy
- Pridajte nový stĺpec
emaildo tabuľky. - Upravte
/addtak, aby prijímal meno aj e-mail. - Pridajte route na vymazanie študenta.
- Upravte aplikáciu tak, aby vracala JSON namiesto obyčajného textu.
Diskusia o bezpečnosti
Prečo prihlasovacie údaje NESMÚ byť pevne zapísané v kóde
Ak vložíte heslo alebo reťazec pripojenia priamo do zdrojového kódu, skončí vo verziovacom systéme (git) a bude viditeľný pre každého, kto má prístup k repozitáru — vrátane verejných repozitárov na GitHube. Raz zacommitované tajomstvá je veľmi ťažké úplne odstrániť.
Prečo sú premenné prostredia bezpečnejšie
Premenné prostredia sa nastavujú za behu v prostredí nasadenia a nikdy sa neukladajú do zdrojového kódu. Azure App Service umožňuje nastaviť ich ako Application Settings, ktoré sú šifrované v pokoji a injektované do aplikácie pri štarte. Tým sa oddeľujú tajomstvá od kódu.
Pravidlá firewallu
Pravidlo firewallu použité v tomto labe (0.0.0.0 až 0.0.0.0) povoľuje pripojenie všetkým službám Azure. Je to pohodlné, ale príliš široko otvorené. V produkcii by ste mali obmedziť prístup na konkrétne IP adresy alebo použiť Private Endpoints, aby ste zabránili neoprávnenému prístupu z iných Azure tenantov.
Princíp minimálnych oprávnení
Databázový používateľ, ktorého aplikácia používa, by mal mať iba oprávnenia, ktoré potrebuje — zvyčajne SELECT, INSERT, UPDATE a DELETE na konkrétnych tabuľkách. Nemalo by ísť o účet správcu servera (sqladmin). Tým sa obmedzí škoda, ak by prihlasovacie údaje boli niekedy kompromitované.