Python → Python projekti → Python REST API
Napredni Python REST API (Flask RESTful)
Projekat 12 od 12
□ Ovo je pravi backend projekat — sledeći korak ka profesionalnom programiranju.
U ovom projektu pravimo napredni REST API koristeći Flask i Flask-RESTful.
Za razliku od prethodne lekcije, ovde uvodimo:
- rad sa bazom podataka (SQLite)
- organizaciju koda
- rad sa ID-jevima
- realističan API dizajn
Ovo je prvi korak ka pravim backend sistemima koji se koriste u industriji.
Potrebni alati
- Python 3
- Flask
- Flask-RESTful
- SQLite (ugrađena baza)
- Postman ili browser
Instalacija
pip install flask
pip install flask-restful
Struktura projekta
projekat/
│
├── app.py
├── database.db
U većim projektima koristićeš više fajlova (models, routes...), ali ovde sve držimo jednostavno.
Napredni REST API sa bazom
from flask import Flask, request
from flask_restful import Resource, Api
import sqlite3
app = Flask(__name__)
api = Api(app)
def get_db():
return sqlite3.connect("database.db")
# Kreiranje tabele (pokreni jednom)
def create_table():
conn = get_db()
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
author TEXT
)
""")
conn.commit()
conn.close()
create_table()
class BookList(Resource):
def get(self):
conn = get_db()
cursor = conn.cursor()
cursor.execute("SELECT * FROM books")
rows = cursor.fetchall()
conn.close()
books = []
for row in rows:
books.append({
"id": row[0],
"title": row[1],
"author": row[2]
})
return books
def post(self):
data = request.get_json()
if not data.get("title"):
return {"error": "Title je obavezan"}, 400
conn = get_db()
cursor = conn.cursor()
cursor.execute("INSERT INTO books (title, author) VALUES (?, ?)",
(data["title"], data.get("author", "")))
conn.commit()
conn.close()
return {"message": "Knjiga dodata"}, 201
class Book(Resource):
def get(self, book_id):
conn = get_db()
cursor = conn.cursor()
cursor.execute("SELECT * FROM books WHERE id=?", (book_id,))
row = cursor.fetchone()
conn.close()
if row:
return {
"id": row[0],
"title": row[1],
"author": row[2]
}
return {"error": "Nije pronađeno"}, 404
def delete(self, book_id):
conn = get_db()
cursor = conn.cursor()
cursor.execute("DELETE FROM books WHERE id=?", (book_id,))
conn.commit()
conn.close()
return {"message": "Obrisano"}
api.add_resource(BookList, '/books')
api.add_resource(Book, '/books/<int:book_id>')
if __name__ == '__main__':
app.run(debug=True)
Kako radi ovaj API?
- /books (GET) → vraća sve knjige
- /books (POST) → dodaje novu knjigu
- /books/<id> (GET) → vraća jednu knjigu
- /books/<id> (DELETE) → briše knjigu
Ključna razlika u odnosu na osnovni API
- podaci se čuvaju u bazi (ne u listi)
- postoji trajnost podataka
- koristimo SQL upite
- radimo sa ID-jevima
Testiranje API-ja
# GET
http://127.0.0.1:5000/books
# POST
{
"title": "Python",
"author": "Marko"
}
Česte greške
- ❌ baza nije kreirana
- ❌ pogrešan JSON format
- ❌ nedostaje title
- ❌ pogrešan URL
Kako dalje unaprediti projekat?
- dodati PUT (update)
- dodati autentifikaciju (login)
- razdvojiti kod u više fajlova
- koristiti ORM (SQLAlchemy)
- deploy na server
Ovo su stvari koje rade pravi backend developeri.
Mini izazovi
- Dodaj update (PUT) metodu
- Dodaj polje "year"
- Dodaj pretragu po naslovu
Povezane lekcije i projekti
Često postavljana pitanja
Koja je razlika između ovog i prethodnog API-ja?
Ovde koristimo bazu podataka i radimo realniji backend sistem.
Da li je Flask dovoljno dobar za ozbiljne projekte?
Da — Flask se koristi u mnogim realnim aplikacijama.
Šta dalje učiti?
Autentifikaciju, baze, deploy i frontend povezivanje.