Kihagyás

Python backend alapok

Ebben a részben bemutatom, hogyan fejleszthetsz Flask alapú webes alkalmazásokat, amelyek JSON formátumban válaszolnak és az URL-ben kapott azonosítók alapján dolgoznak.

HTTP metódusok

Az HTTP (Hypertext Transfer Protocol) egy olyan protokoll, amely lehetővé teszi a kliens és a szerver közötti kommunikációt. Az HTTP kéréseknek többféle típusa van, amelyeket metódusoknak nevezünk. A leggyakrabban használt metódusok a következők:

Metódus Leírás
GET Az adatok lekérdezésére használt metódus
POST Az adatok küldésére használt metódus
PUT Az adatok frissítésére használt metódus
DELETE Az adatok törlésére használt metódus

A fenti táblázat csak a leggyakrabban használt metódusokat tartalmazza, de létezik még több metódus is, amelyeket a HTTP specifikáció részletez.

JSON

A kommunikáció JSON formátumban történik, amelyet már korábbban is láthattunk. Amennyiben ismereteink hiányosak, tekintsük meg az ehhez kapcsolódó anyagot:

Kapcsolódó anyag megtekintése

Flask telepítése

Először is, telepítsük a Flask könyvtárat a következő paranccsal pip segítségével:

python3 -m venv .venv
pip install -U Flask

Megjegyzés

A pip egy csomagkezelő eszköz, amely segítségével könnyedén telepíthetünk Python csomagokat.

Probléma esetén

Ha a pip segítségével sikeresen telepítetted a Flasket, de futtatáskor a Visual Studio Code-ban No module named 'flask' hibaüzenetet kapod, akkor valószínűleg a környezeti változók között nem szerepel a Python elérési útvonala. Ezt a problémát úgy orvosolhatod, hogy parancssorból futatod a programot: python3 backend.py.

Alap Flask alkalmazás JSON válasszal

Hozzunk létre egy Flask alkalmazást, amely JSON választ ad:

backend.py
from flask import Flask, jsonify

app = Flask(__name__)


@app.route("/api")
def hello_world():
    res = {"message": "Hello, World!"}
    return jsonify(res)


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

Ez az alkalmazás egy egyszerű JSON választ ad a /api útvonalon.

Próbáld ki

Indítsd el a programot, majd írd be a böngészőbe: http://127.0.0.1:5000/api

Terminálban
* Serving Flask app 'backend'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with watchdog (windowsapi)
* Debugger is active!
* Debugger PIN: 108-864-203
Böngészőben
{
    "message": "Hello, World!"
}

Egyéb HTTP metódusok kezelése

A fenti példában egy alapértelmezett, a böngésző által is használt GET metódust használtunk. Ha szeretnénk más metódusokat is kezelni, akkor azt a methods paraméterrel tehetjük meg:

backend.py
from flask import Flask, jsonify, request

app = Flask(__name__)


@app.route("/api", methods=["POST"])
def hello_world():
    res = {"message": "Hello, World!"}
    return jsonify(res)


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

Megjegyzés

Amennyiben nincs megadva a methods paraméter, akkor az alapértelmezett metódus a GET lesz.

Ennek teszteléséhez már speciálisabb eszközre van szükség, mint a böngésző. A Postman egy ilyen eszköz, amely segítségével különböző HTTP metódusokkal tesztelhetjük az alkalmazásunkat.

URL-ben kapott azonosítók kezelése

A Flask lehetővé teszi paraméterek fogadását az URL-ből, amelyek segítségével dinamikusan kezelhetjük a kéréseket.

Szám esetén:

@app.route('/api/items/<int:item_id>')
def get_item(item_id):
    # Itt normál esetben adatbázisból kérdeznénk le az adatokat az item_id alapján
    # A példa kedvéért egy statikus objektumot adunk vissza
    item = {'id': item_id, 'name': 'Item Neve', 'description': 'Ez egy példa elem.'}
    return jsonify(item)

Szöveg esetén:

@app.route('/api/users/<username>')
def show_user_profile(username):
    # Itt visszaadhatjuk a felhasználó profilját JSON formátumban
    item = {'user': username}
    return jsonify(item)

Példa

backend.py
from flask import Flask, jsonify, request

app = Flask(__name__)


@app.route("/api/items/<int:item_id>")
def get_item(item_id):
    # Itt normál esetben adatbázisból kérdeznénk le az adatokat az item_id alapján
    # A példa kedvéért egy statikus objektumot adunk vissza
    item = {"id": item_id, "name": "Item Neve", "description": "Ez egy példa elem."}
    return jsonify(item)


@app.route("/api/users/<username>")
def show_user_profile(username):
    # Itt visszaadhatjuk a felhasználó profilját JSON formátumban
    item = {"user": username}
    return jsonify(item)


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

HTTP státuszkódok

Az HTTP státuszkódok segítségével a szerver visszajelzést ad a kliensnek a kérés állapotáról.

A státuszkódok általában öt csoportra oszthatók:

  • 1xx (Információs válaszok): Ideiglenes válaszok, amelyek tájékoztatják a klienst a kérés feldolgozásának előrehaladásáról.
  • 2xx (Sikeres válaszok): A kérés sikeresen feldolgozásra került.
  • 3xx (Átirányítási üzenetek): További lépéseket kell tenni a kérést teljesítő erőforrás eléréséhez.
  • 4xx (Klienshiba): A kérés hibás volt, és nem lehetett feldolgozni.
  • 5xx (Szerverhiba): A szerver nem tudta teljesíteni egy érvényes kérést.

Leggyakrabban használt státuszkódok:

Státuszkód Jelentés Példa
200 OK A kérés sikeresen teljesült, például egy lista adatok sikeres lekérése.
201 Created Egy új felhasználó sikeresen létrejött a rendszerben.
202 Accepted A kérés feldolgozásra került, de a művelet még nem fejeződött be, pl. e-mail küldés.
204 No Content Egy erőforrás sikeresen frissült, de nincs visszaküldendő adat.
301 Moved Permanently Egy régi URL véglegesen átirányítva az új URL-re, pl. /old-page/new-page.
302 Found (Temporary Redirect) Az URL ideiglenesen átirányítva, pl. promóciós oldal esetén.
304 Not Modified A kliens által kért erőforrás nem változott az utolsó lekérés óta.
307 Temporary Redirect Ideiglenes átirányítás másik URL-re, de ugyanazzal a HTTP-metódussal.
308 Permanent Redirect Hasonló a 301-hez, de biztosítja, hogy az átirányítás HTTP-metódus megőrzésével történjen.
400 Bad Request Érvénytelen kérésformátum, pl. hiányzó vagy hibás mezők egy űrlapbeküldésben.
401 Unauthorized Bejelentkezés szükséges, pl. egy védett API elérésénél érvénytelen tokennel.
403 Forbidden A felhasználónak nincs jogosultsága az erőforrás eléréséhez, pl. adminisztrációs oldal.
404 Not Found Nem található az adott URL-en a kért erőforrás, pl. rossz ID alapján keresés.
405 Method Not Allowed A kérésben használt HTTP-metódus nem támogatott az adott erőforráson, pl. POST egy GET-hez kötött végponton.
406 Not Acceptable Az ügyfél által elfogadott válaszformátum nem érhető el, pl. csak XML, de JSON kellene.
409 Conflict Ütközés az erőforrással, pl. egy meglévő e-mail cím használatával próbál valaki regisztrálni.
415 Unsupported Media Type A kérésben szereplő tartalomtípus nem támogatott, pl. nem JSON, hanem XML küldése.
422 Unprocessable Entity Érvényes formátumú, de logikailag hibás adat, pl. jövőbeli dátum egy múltbeli eseményhez.
429 Too Many Requests Az ügyfél túl sok kérést küldött rövid idő alatt, pl. API limit túllépése.
500 Internal Server Error A szerveren váratlan hiba történt, pl. adatbázis-összekapcsolási hiba.
501 Not Implemented A kérésben használt funkció nem támogatott a szerveren, pl. nem implementált végpont.
502 Bad Gateway A szerver hibás választ kapott egy másik szervertől, pl. egy proxyn keresztül.
503 Service Unavailable A szolgáltatás ideiglenesen nem elérhető, pl. karbantartás alatt.
504 Gateway Timeout Az egyik szerver nem kapott időben választ egy másik szervertől.
505 HTTP Version Not Supported A kliens által használt HTTP-verzió nem támogatott, pl. HTTP/2-t kér, de csak HTTP/1.1 érhető el.

A Flask lehetővé teszi a státuszkódok beállítását a status paraméter segítségével.

Példa

@app.route('/api/items/<int:item_id>')
def get_item(item_id):
    # Itt normál esetben adatbázisból kérdeznénk le az adatokat az item_id alapján
    # A példa kedvéért egy statikus objektumot adunk vissza
    item = {'id': item_id, 'name': 'Item Neve', 'description': 'Ez egy példa elem.'}
    return jsonify(item), 200

Összefoglalás

Ez az oktatóanyag bemutatta, hogyan lehet Flask alapú alkalmazásokat fejleszteni, amelyek képesek JSON válaszokat adni és URL-ben átadott azonosítókat kezelni. A Flask segítségével rugalmasan kezelhetjük a webes API kéréseket, lehetővé téve dinamikus webalkalmazások fejlesztését.

Feladatok

Készíts egy Flask alkalmazást, amely betölti a konyvtar.cs fájl tartalmát, majd az alábbi végpontoknak megfelelően működik:

Végpont Típus Leírás
/konyvek GET Visszaadja a konyvtar.cs fájl tartalmát JSON formátumban
/konyv/{isbn} GET Visszaadja a megadott ISBN számú könyv adatait JSON formátumban
/konyv/{isbn} DELETE Törli a megadott számú ISBN könyvet
konyvtar.csv
Szerző,Cím,Kiadás Éve,ISBN,Állapot
J.K. Rowling,Harry Potter and the Philosopher's Stone,1997,0-7475-3269-9,Olvasott
George Orwell,1984,1949,0-452-28423-6,Olvasatlan
J.R.R. Tolkien,The Hobbit,1937,0-618-00221-9,Olvasott
F. Scott Fitzgerald,The Great Gatsby,1925,0-7432-7356-7,Olvasatlan
Jane Austen,Pride and Prejudice,1813,0-19-283355-X,Olvasott
Harper Lee,To Kill a Mockingbird,1960,0-06-112008-1,Olvasott
Mark Twain,The Adventures of Huckleberry Finn,1884,0-14-310732-1,Olvasatlan
Charles Dickens,Great Expectations,1861,0-14-143956-4,Olvasott
Leo Tolstoy,War and Peace,1869,0-19-926794-4,Olvasatlan
Ernest Hemingway,The Old Man and the Sea,1952,0-684-80122-1,Olvasott
William Shakespeare,Hamlet,1603,978-0521618748,Olvasatlan
Agatha Christie,Murder on the Orient Express,1934,0-000-72825-6,Olvasott
Louisa May Alcott,Little Women,1868,0-451-52994-6,Olvasatlan
Charlotte Brontë,Jane Eyre,1847,0-14-144114-3,Olvasott
Dan Brown,The Da Vinci Code,2003,0-385-50420-9,Olvasatlan
Kiindulási segédlet
backend.py
from flask import Flask, jsonify, request

app = Flask(__name__)


@app.route("/konyvek")
def get_books():
    items = list()
    return jsonify(items)


@app.route("/konyv/<isbn>")
def get_book(username):
    item = {}
    return jsonify(item)


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