Diákok nyilvántartása

Feladatleírás

Készítsen egy weboldalt, amely lehetővé teszi a felhasználók számára, hogy diákok adatait egy adatbázisban kezeljék!

A rendszer funkciója, hogy segítséget nyújtson a felhasználónak a diákok adatainak listázásában, továbbá lehetővé tegye a diákok törlését és adatainak módosítását.

Követelmények

A feladat megvalósítása Python Flask segítségével történjen.

Adatbázis

A diákok adatainak tárolására és az adatok kezelésére egy SQLite adatbázisban hozzon létre egy diakok táblát a következő oszlopokkal:

📝
SQLite-ban ha az id mezőt a következőképpen adjuk meg: id INTEGER PRIMARY KEY , akkor az adatbázis auto_increment-es id-ként kezeli!

Működés

  1. A weboldal kérje be a diákok adatait:
  2. Validálja az adatokat:
  3. A bekért adatokat mentse el a diakok.db-be, amikor a felhasználó a "Mentés" gombra kattint.
  4. A weboldalon jelenjen meg a diákok listája.
  5. Legyen lehetőség a diákok törlésére!
  6. Legyen lehetőség a diákok módosítására!

Megjelenés:

  1. Legyen megformázva a weboldal.
  2. A weboldal legyen felhasználóbarát és könnyen használható.
  3. A diákok adatai legyenek megfelelően formázva és megjelenítve.
  4. Az oldalon az adatok frissüljenek, amikor felvissznek egy új diákot.

Tesztelés

Készüljön egy tesztjegyzőkönyv is az elkészült feladatra! A jegyzőkönyvben legyen minimum 3 féle tesztelés (pl. validálás, egységteszt, végpont tesztelés, integrációs teszt...)!

A tesztelést a test_app.py-ban kell megvalósítani. (Kivéve a validálásokat!)

A jegyzőkönyv készülhet Word-ben, .pdf-ben vagy .md-ben, a neve: tesztjegyzokonyv




Beadás

Az elkészült fájlokat (a .venv-et kivéve) tömörítve monogram_teszteles.zip (pl: KB_teszteles.zip) néven az email címemre: kissb@verebelyszki.hu kérem.

Beküldési határidő: 2026.05.20 23:59.




📊 Megoldásra példa

app.py

from flask import Flask, render_template, request, redirect, url_for import sqlite3 app = Flask(__name__) # Adatbázis kapcsolat def get_db_connection(): conn = sqlite3.connect('diakok.db') conn.row_factory = sqlite3.Row return conn # Tábla létrehozása def create_table(): conn = get_db_connection() cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS diakok ( id INTEGER PRIMARY KEY, nev TEXT, email TEXT ) ''') conn.commit() cursor.close() conn.close() create_table() # Új diák hozzáadása @app.route('/', methods=['GET', 'POST']) def index(): # Új diák hozzáadása az adatbázishoz if request.method == 'POST': conn = get_db_connection() cursor = conn.cursor() cursor.execute(''' INSERT INTO diakok (nev, email) VALUES (?, ?)''', (request.form['nev'], request.form['email'])) conn.commit() cursor.close() conn.close() return redirect(url_for('index')) # Diákok megjelenítése conn = get_db_connection() cursor = conn.cursor() diakok = cursor.execute('SELECT id, nev, email FROM diakok').fetchall() cursor.close() conn.close() return render_template('index.html', diakok=diakok) # Diák törlése @app.route('/delete/<int:index>') def delete_diak(index): conn = get_db_connection() cursor = conn.cursor() cursor.execute('DELETE FROM diakok WHERE id = ?', (index,)) conn.commit() cursor.close() conn.close() return redirect(url_for('index')) # Diák módosítása @app.route('/edit/<int:index>', methods=['GET', 'POST']) def edit_diak(index): conn = get_db_connection() cursor = conn.cursor() diak = cursor.execute('SELECT * FROM diakok WHERE id = ?', (index,)).fetchone() cursor.close() conn.close() if request.method == 'POST': conn = get_db_connection() cursor = conn.cursor() cursor.execute(''' UPDATE diakok SET nev = ?, email = ? WHERE id = ?''', (request.form['nev'], request.form['email'], index)) conn.commit() cursor.close() conn.close() return redirect(url_for('index')) return render_template('edit.html', diak=diak) if __name__ == '__main__': app.run(debug=True)

index.html

<!DOCTYPE html> <html> <head> <title>Diákok</title> </head> <body> <h1>Diákok</h1> <form method="POST"> <label>Név:</label> <input type="text" name="nev"><br><br> <label>Email:</label> <input type="email" name="email"><br><br> <input type="submit" value="Mentés"> </form> <h2>Diákok listája:</h2> <ul> {% for diak in diakok %} <li>{{ diak[1] }} ({{ diak[2] }}) - <a href="{{ url_for('delete_diak', index=diak[0]) }}">Törlés</a> - <a href="{{ url_for('edit_diak', index=diak[0]) }}">Módosítás</a> </li> {% endfor %} </ul> </body> </html>

edit.html

<!DOCTYPE html> <html> <head> <title>Diák módosítása</title> </head> <body> <h1>Diák módosítása</h1> <form method="POST"> <label>Név:</label> <input type="text" name="nev" value="{{ diak[1] }}"><br><br> <label>Email:</label> <input type="email" name="email" value="{{ diak[2] }}"><br><br> <input type="submit" value="Mentés"> </form> </body> </html>


📊 Tesztjegyzőkönyv példa

Tesztjegyzőkönyv

Validálás

Teszt eset Leírás Eredmény
1. Üres név és email Hibaüzenet: A név és az email cím kötelező.
2. Érvénytelen email cím Hibaüzenet: Érvénytelen email cím.
3. Ugyanaz a név és email Hibaüzenet: A név és az email cím már létezik.

Egységteszt

import unittest from your_app import get_db_connection class TestDatabase(unittest.TestCase): def test_get_db_connection(self): conn = get_db_connection() self.assertIsNotNone(conn) conn.close() if __name__ == '__main__': unittest.main()
Teszt eset Leírás Eredmény
1. Adatbázis kapcsolat teszt Sikerült

Végpont teszt

import unittest from your_app import app class TestEndpoints(unittest.TestCase): def test_index(self): tester = app.test_client() response = tester.get('/') self.assertEqual(response.status_code, 200) def test_delete_diak(self): tester = app.test_client() response = tester.get('/delete/1') self.assertEqual(response.status_code, 302) def test_edit_diak(self): tester = app.test_client() response = tester.get('/edit/1') self.assertEqual(response.status_code, 200) if __name__ == '__main__': unittest.main()
Teszt eset Leírás Eredmény
1. Főoldal teszt 200 OK
2. Diák törlése teszt 302 Found
3. Diák szerkesztése teszt 200 OK

Integrációs teszt

import unittest from your_app import app, get_db_connection class TestIntegration(unittest.TestCase): def test_add_diak(self): tester = app.test_client() response = tester.post('/', data={'nev': 'Test Diak', 'email': 'test@example.com'}) self.assertEqual(response.status_code, 302) conn = get_db_connection() cursor = conn.cursor() diakok = cursor.execute('SELECT * FROM diakok WHERE nev = ? AND email = ?', ('Test Diak', 'test@example.com')).fetchall() cursor.close() conn.close() self.assertEqual(len(diakok), 1) if __name__ == '__main__': unittest.main()
Teszt eset Leírás Eredmény
1. Diák hozzáadása teszt Sikerült


A listát egyszerűen a következőképpen tudod kiíratni a weboldalon:

server oldalon kirendeljük az adatokat:

return render_template('index.html', diakok=diakok)
<h2>Diákok listája</h2> <ul> {% for diak in diakok %} <li> {{ diak.nev }} ({{ diak.email }}) - Életkor: {{ diak.letkor }} - Hobbi: {{ diak.hobbi }} - Érdeklődési kör: {{ diak.erdeklodesi_kor }} </li> {% endfor %} </ul>