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.

JSON

A JSON (JavaScript Object Notation) egy adatcsere formátum, amely ember és gép által is olvasható. Ez teszi lehetővé többek között, hogy két különböző programozási nyelv közötti adatcsere könnyen megvalósítható legyen. A JSON adatokat kulcs-érték párok formájában tárolja, amelyeket vesszővel választ el. A kulcsokat és az értékeket kettősponttal választjuk el. A JSON adatokat kapcsos zárójelek között tároljuk.

1
2
3
4
5
{
    "name": "John",
    "age": 30,
    "city": "New York"
}

Lehetőség van tömbök tárolására is:

1
2
3
4
5
6
{
    "name": "John",
    "age": 30,
    "city": "New York",
    "children": ["Ann", "Billy"]
}

Több ugyanolyan struktúrájú objektum tárolására is lehetőség van:

[
    {
        "name": "John",
        "age": 30,
        "city": "New York",
        "children": ["Ann", "Billy"]
    },
    {
        "name": "Jane",
        "age": 25,
        "city": "New York",
        "children": ["Tom"]
    }
]

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.

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
200 OK
201 Created
202 Accepted
204 No Content
301 Moved Permanently
302 Found (Temporary Redirect)
304 Not Modified
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
405 Method Not Allowed
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout

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)