This is an old revision of the document!
La job:
La licență:
La interviuri:
Proiecte personale:
În acest laborator veți înțelege cum funcționează cu adevărat o aplicație web. Veți scrie codul care procesează cereri, validează date, interacționează cu baza de date și returnează răspunsuri - toate acestea fiind componentele esențiale ale oricărei aplicații moderne. Veți dezvolta o aplicație completă folosind arhitectura client-server. În plus față de laboratoarele anterioare, veți crea un backend REST API în Flask care gestionează task-uri (adăugare, citire, actualizare, ștergere) și le stochează într-o bază de date SQLite.
Arhitectura client-server reprezintă un model de proiectare utilizat în dezvoltarea de aplicații distribuite. În acest model, două entități distincte comunică pentru a furniza funcționalitatea unei aplicații: clientul și serverul.
Clientul este entitatea care inițiază cererea către server. De obicei, acesta este un utilizator final sau un dispozitiv care solicită resurse, date sau servicii de la server. Exemple de clienți includ browsere web, aplicații mobile sau desktop-uri.
Serverul este entitatea care procesează cererea primită de la client și oferă un răspuns adecvat. Serverele stochează resursele și datele necesare și gestionează logica de afaceri a aplicației. Un server poate servi mai mulți clienți simultan.
Protocolul HTTP (Hypertext Transfer Protocol) este unul dintre cele mai utilizate protocoale de comunicare în arhitectura client-server, în special pentru aplicațiile web. HTTP definește cum trebuie să fie formatate cererile (requests) și răspunsurile (responses) între client și server.
O cerere HTTP tipică include:
Răspunsul HTTP include:
Mecanismul de bază în arhitectura client-server este Request-response cycle.
Acest proces permite interacțiunea continuă între client și server, fiecare cerere fiind procesată independent.
Un endpoint este o adresă URL la care serverul răspunde. În Flask:
@app.route('/tasks', methods=['GET']) def get_tasks(): # Logica pentru a returna toate task-urile return jsonify(tasks)
Datele sunt trimise între client și server în format JSON (document):
{
"id": 1,
"title": "Învață Flask",
"completed": false
}
1. Pentru a începe, asigurați-vă că aveți instalat Python.
Nu aveți Python? > python.org/downloads (bifați “Add to PATH” la instalare!)
2. Verificați instalarea rulând comanda în terminal: python –version.
3. Descarcati scheletul de cod de aici.
git clone https://github.com/ACS-ISI/Backend_Server cd Backend_Server
Nu aveți git? > Descărcați ZIP de pe GitHub > Extract
py -3 (3.x) sau python3 (pe Linux), respectiv versiunea de package manager: py -3 -m pip sau pip3 (pe Linux)
Pentru a instala dependențe folosim package manager-ul pip:
pip install flask flask-sqlalchemy
Pentru a instala dependențele specificate într-un fișier folosim flag-ul -r:
py -3 -m pip install -r requirements.txt
py -3 app.py
Alternativă pentru Linux:
pip install -r requirements.txt
pip3 install -r requirements.txt
python app.py
python3 app.py
Salvați fișierul după fiecare modificare. Serverul se restartează automat (debug mode).
4. Deschideti proiectul folosind IDE-ul preferat, de exemplu Visual Studio Code cu extensia Python sau un IDE specializat pentru Python, precum PyCharm și rulați comanda pentru instalarea dependențelor din fișierul requirements.txt.
Vom folosi Flask-SQLAlchemy pentru a crea o bază de date SQLite (pentru simplitate), fără a fi necesară configurarea unui server SQL dedicat.
5. Dupa finalizarea primului TO DO pentru testare descarcati postman de aici.
1. New Request:
2. Body > raw > JSON:
{
"completed": true
}
3. Send
Rezultat așteptat:
{
"id": 1,
"title": "Finalizează laboratorul",
"description": "Task 1 și Task 2",
"completed": true
}
De obicei, cererile de tip GET nu conțin date în body și se parametrizează astfel:
Exemplu cereri GET cu parametru în URL:
http://localhost:5000/login?username=alex&password=1234
@app.route('/login', methods=['GET']) def login(): username = request.args.get('username') print(username) password = request.args.get('password') print(password) return jsonify({"status": True})
Completati TO DO-urile din scheletul de cod, acestea sunt self explanatory. Scopul acestora este sa intelegeti cum sa interactionati cu o baza de date prin intermediul unui server. Prin aceste metode numite endpoint-uri puteti realiza comunicarea dintre client si server.
Testati fiecare endpoint in parte, verificati ca functioneaza corect. Mai jos este descris un test case pe care sa-l abordati, iar de la acesta puteti sa realiza propriile voastre test case-uri.
Test Case: am adaugat 3 task-uri folosind endpoint-ul de adaugat task-uri, iar cand apelez endpoint-ul prin care obtin o lista cu task-uri acesta returneaza cele 3 task-uri adaugate anterior.
Verificați funcționarea aplicației folosind următoarele metode:
2. Pentru a adauga calea verificati adnotarea fiecarui endpoint (@app.route(”/task/cale”)).
3. Verificati tipul metodei (POST/ GET/ etc.)
Instalați DB Browser for SQLite (versiunea portabilă). Acesta vă permite să accesați o bază de date SQLite folosind un editor vizual. Verificați conținutul bazei de date: deschideți din editor fișierul tasks.db din folder-ul instance
Rulați aplicația client din folder-ul frontend prin deschiderea fișierului index.html cu un browser. Verificați funcționarea sistemului integrat client-server. Examinați codul aplicației, identificați modul în care se transmit cererile HTTP și cum se realizează interfața cu utilizatorul.
Eroare: “ModuleNotFoundError: No module named 'flask'” Soluție: Nu ai instalat dependențele. Rulează:
pip install -r requirements.txt
Eroare: “Address already in use” Soluție: Portul 5000 este deja folosit. Oprește procesul anterior sau schimbă portul:
app.run(debug=True, port=5001)
Eroare: “404 Not Found” când testezi în Postman
Verificări:
Date nu apar în baza de date
Verificări:
În laboratorul anterior ați folosit Firebase Realtime Database - o soluție “Backend as a Service” (BaaS) care oferă:
Firebase este excelent pentru: prototipuri rapide, aplicații simple, MVP-uri, aplicații care necesită sincronizare în timp real out-of-the-box.
În practică, majoritatea aplicațiilor profesionale necesită un backend propriu din următoarele motive:
Comparație
| Aspect | Firebase | Flask Backend |
| Timp de setup | 10 minute | 30-60 minute |
| Curba de învățare | Ușoară | Medie |
| Logică complexă | Limitată | Nelimitată |
| Query-uri avansate | Limitate | Completă (SQL) |
| Securitate | Reguli Firebase | Control total |
| Costuri | Eventual cu plată | Controlabile |
| Integrări | Limitate | Nelimitate |
| Debugging | Dificil | Ușor (logs locale) |
| Testare | Dificilă | Ușoară (unit tests) |
| Portabilitate | Locked-in Google | Portabil oriunde |
Folosește Firebase când:
Folosește Flask (sau alt framework) când: