12.2 Flask: Python kā web serveris

Tavs šīs stundas izaicinājums: Uzbūvēt savu pirmo Flask web serveri ar vairākām maršrutēm un atgriezt JSON datus.

SR 2.4.11. Lieto standartizētas bibliotēkas un API SR 2.4.15. Modulāras programmas un funkcijas

Teorija: Flask pamatkomponenti

Flask ir mikro-ietvars Python — tikai 100 KB, bet pietiekams reāliem projektiem. Instalācija: pip install flask.

from flask import Flask, jsonify, request

app = Flask(__name__)

# Vienkārša maršruta
@app.route("/")
def home():
    return "<h1>Sveiks!</h1>"

# JSON atbilde
@app.route("/api/speletaji")
def saraksts():
    return jsonify([
        {"vards": "Anna", "punkti": 120},
        {"vards": "Jānis", "punkti": 95}
    ])

# Maršruta ar parametru
@app.route("/api/speletajs/<int:id>")
def viens(id):
    return jsonify({"id": id, "vards": "Anna"})

# POST pieprasījums
@app.route("/api/saglabat", methods=["POST"])
def saglabat():
    dati = request.json
    return jsonify({"status": "ok", "saņēmu": dati}), 201

if __name__ == "__main__":
    app.run(debug=True, port=5000)

Palaiž ar python app.py → atver http://localhost:5000/.

1. uzdevums: Pirmais Flask serveris

Izveido un palaiž pamatu.

Izpildes soļi:

  1. Termināli: pip install flask.
  2. Izveido failu app.py ar minimālo "Hello World" maršrutu.
  3. Palaiž: python app.py.
  4. Atver pārlūkā http://localhost:5000.
  5. Pievieno otru maršrutu /par, kas atgriež HTML par tevi.

2. uzdevums: JSON API maršrutas

Pievieno datu maršrutas.

Izpildes soļi:

  1. Izveido sarakstu SPELETAJI = [{"id": 1, "vards": "Anna", "punkti": 120}, ...] globāli.
  2. Maršruta GET /api/speletaji: atgriež visus.
  3. Maršruta GET /api/speletaji/<int:id>: atgriež vienu pēc ID; 404, ja nav atrasts.
  4. Pārbaudi pārlūkā vai ar curl http://localhost:5000/api/speletaji.

3. uzdevums: POST un dati no klienta

Pieņem datus no pārlūka.

Izpildes soļi:

  1. Maršruta POST /api/speletaji: lasa request.json, pievieno sarakstam, atgriež jauno ar 201 status.
  2. Pievieno validāciju: ja trūkst vards, atgriež 400 ar kļūdas paziņojumu.
  3. Pārbaudi ar curl: curl -X POST -H "Content-Type: application/json" -d '{"vards":"Eva","punkti":150}' http://localhost:5000/api/speletaji.
  4. Pievieno DELETE /api/speletaji/<int:id> maršrutu.
  5. Sadali kodu moduļos: routes.py un main.py.

Papildus uzdevums: Flask templates ar Jinja

Renderē HTML lapas no Python.

Izpildes soļi:

  1. Izveido mapi templates/ un tajā index.html ar {{ vards }} placeholder.
  2. Maršruta: return render_template("index.html", vards="Anna").
  3. Pievieno {% for s in saraksts %}...{% endfor %} ciklu.
  4. Salīdzini ar JSON API pieeju.

Biežākās kļūdas

Koda piemērs

from flask import Flask, jsonify, request

app = Flask(__name__)
SPELETAJI = [{"id": 1, "vards": "Anna", "punkti": 120}]

@app.route("/api/speletaji")
def visi():
    return jsonify(SPELETAJI)

@app.route("/api/speletaji", methods=["POST"])
def pievienot():
    d = request.json
    if not d or "vards" not in d:
        return jsonify({"kluda": "Trūkst vārds"}), 400
    jauns = {"id": len(SPELETAJI) + 1, "vards": d["vards"], "punkti": d.get("punkti", 0)}
    SPELETAJI.append(jauns)
    return jsonify(jauns), 201

if __name__ == "__main__":
    app.run(debug=True)
GET /api/speletaji → [{...}]
POST /api/speletaji → 201 Created
⬅ Iepriekšējā stunda Nākamā stunda ➡