A kutatómunka eredményeként készítsetek egy md-t (Markdown-t). Legyen benne egy ábra, és legalább egy hivatkozás is. (Ha nem tudjátok mi az az md, nézzetek utána!)
A feladatban egy könyvtár kezelésére szolgáló REST API-t kell megvalósítani. Az API lehetővé teszi a könyvek hozzáadását, lekérdezését, frissítését és törlését.
Készítsetek egy REST API-t, amely az alábbi funkciókat támogatja:
id (a könyv azonosítója),title (a könyv címe),author (a könyv szerzője),published_year (a könyv megjelenésének éve).A feladat során gyakoroljátok a cURL használatát is. A következő cURL parancsokat kell végrehajtani az API tesztelésére:
Az elkészített könyvtár API adatai jelenleg egy Python listában tárolódnak, amely a Flask alkalmazás memóriájában él. Az adatok nem tartósak, és az alkalmazás újraindításakor elvesznek.
Későbbiekben az átmeneti tárolás helyett célszerű (fogjuk is!) az adatokat tartósan, például egy adatbázisban (pl. SQLite, MySQL...) vagy fájlban tárolni.
from flask import Flask, jsonify, request
app = Flask(__name__)
# Könyvek adatbázisa
books = []
# Könyv Hozzáadása
@app.route('/books', methods=['POST'])
def add_book():
data = request.json
new_book = {
'id': len(books) + 1,
'title': data['title'],
'author': data['author'],
'published_year': data['published_year']
}
books.append(new_book)
return jsonify(new_book), 201
# Könyvek Listázása
@app.route('/books', methods=['GET'])
def get_books():
return jsonify(books)
# Könyv Részleteinek Lekérdezése
@app.route('/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
book = next((book for book in books if book['id'] == book_id), None)
if book is not None:
return jsonify(book)
return jsonify({'message': 'Book not found'}), 404
# Könyv Frissítése
@app.route('/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):
data = request.json
book = next((book for book in books if book['id'] == book_id), None)
if book is not None:
book['title'] = data['title']
book['author'] = data['author']
book['published_year'] = data['published_year']
return jsonify(book)
return jsonify({'message': 'Book not found'}), 404
# Könyv Törlése
@app.route('/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):
global books
books = [book for book in books if book['id'] != book_id]
return jsonify({'message': 'Book deleted'}), 204
if __name__ == '__main__':
app.run(debug=True)
A cURL eszköz segítségével tesztelhetitek az API működését a következő parancsokkal:
curl -X POST -H "Content-Type: application/json" -d '{"title": "Python Programming", "author": "John Doe", "published_year": 2021}' http://127.0.0.1:5000/books
curl http://127.0.0.1:5000/books
curl http://127.0.0.1:5000/books/1
curl -X PUT -H "Content-Type: application/json" -d '{"title": "Advanced Python", "author": "John Doe", "published_year": 2022}' http://127.0.0.1:5000/books/1
curl -X DELETE http://127.0.0.1:5000/books/1
Az előző feladatot készítsd el úgy, hogy az adatokat adatbázisban tárold el! (SQLite)
A CRUD végpontok és a funkciók ugyanazok mint az előző feladatban, valamint a curl tesztelést is végezd el!
from flask import Flask, jsonify, request
import sqlite3
import os
Importok: Flask a webszerver, sqlite3 az adatbázis kezeléshez, os a fájlok ellenőrzéséhez.
DATABASE = 'books.db'
def get_db_connection():
conn = sqlite3.connect(DATABASE)
conn.row_factory = sqlite3.Row
return conn
Adatbázis csatlakozás függvény:
sqlite3.connect(DATABASE) - Kapcsolódik az adatbázishoz (ha nem létezik, létrehozza)conn.row_factory = sqlite3.Row - Az eredményeket szótárként adja vissza, így könnyebb feldolgoznireturn conn - Visszaadja a kapcsolat objektumotdef init_db():
if not os.path.exists(DATABASE):
conn = get_db_connection()
conn.execute('''
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT NOT NULL,
published_year INTEGER NOT NULL
)
''')
conn.commit()
conn.close()
...
if __name__ == '__main__':
init_db()
app.run(debug=True)
Adatbázis inicializálása:
if not os.path.exists(DATABASE) - Csak akkor fut le, ha az adatbázis még nem létezikCREATE TABLE books - Létrehozza a "books" táblát ezekkel az oszlopokkal:
id INTEGER PRIMARY KEY AUTOINCREMENT - Egyedi azonosító, automatikusan növekediktitle TEXT NOT NULL - A könyv címe, szöveg típus, kötelezőauthor TEXT NOT NULL - A szerző, szöveg típus, kötelezőpublished_year INTEGER NOT NULL - Kiadás éve, szám típus, kötelezőconn.commit() - Mentesíti az adatbázisba a táblátconn.close() - Lezárja a csatlakozástAz alkalmazás belépési pontja:
@app.route('/books', methods=['GET'])
def get_books():
conn = get_db_connection()
books = conn.execute('SELECT * FROM books').fetchall()
conn.close()
return jsonify([dict(book) for book in books])
Összes könyv listázása:
@app.route('/books', methods=['GET']) - GET kérés a /books URL-hezSELECT * FROM books - Összes könyv kiválasztása az adatbázisból.fetchall() - Összes eredmény lekérése[dict(book) for book in books] - A Row objektumokat szótárakká konvertáljareturn jsonify(...) - JSON formátumban küldi vissza a listátCRUD egy rövidítés, amely az négy alapvető adatbázis műveletet jelöli:
| Művelет | Angol | Leírás | HTTP metódus | Adatbázis parancs |
|---|---|---|---|---|
| Create | Létrehozás | Új adat hozzáadása | POST | INSERT |
| Read | Olvasás | Adatok lekérdezése | GET | SELECT |
| Update | Frissítés | Meglévő adat módosítása | PUT/PATCH | UPDATE |
| Delete | Törlés | Adat eltávolítása | DELETE | DELETE |
@app.route('/books', methods=['POST'])
def add_book():
# Új könyv hozzáadása az adatbázishoz
conn.execute('INSERT INTO books (title, author, published_year) VALUES (?, ?, ?)', ...)
Használat: Új könyv felvétele a rendszerbe
@app.route('/books', methods=['GET'])
def get_books():
# Összes könyv lekérdezése
books = conn.execute('SELECT * FROM books').fetchall()
@app.route('/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
# Egy konkrét könyv lekérdezése
book = conn.execute('SELECT * FROM books WHERE id = ?', (book_id,)).fetchone()
Használat: Könyvek megtekintése
@app.route('/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):
# Meglévő könyv adatainak módosítása
conn.execute('UPDATE books SET title = ?, author = ?, published_year = ? WHERE id = ?', ...)
Használat: Könyv adatainak megváltoztatása (pl. cím korrekciója)
@app.route('/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):
# Könyv eltávolítása az adatbázisból
conn.execute('DELETE FROM books WHERE id = ?', (book_id,))
Használat: Könyv törlése a rendszerből
A CRUD az alapja minden adatbázis-kezelő alkalmazásnak. Szinte minden weboldal, mobil app vagy szoftver ezen alapvető műveletek kombinációjából épül fel:
Ha egy alkalmazás támogatja mind a négy műveletet, azt "teljes CRUD funkcionalitású" alkalmazásnak nevezzük.
curl -X POST -H "Content-Type: application/json" -d "{\"title\": \"Python Programming\", \"author\": \"John Doe\", \"published_year\": 2021}" http://127.0.0.1:5000/books
curl -X PUT -H "Content-Type: application/json" -d "{\"title\": \"Advanced Python\", \"author\": \"John Doe\", \"published_year\": 2022}" http://127.0.0.1:5000/books/1