FastAPI aplikacija za upload slika potrošača brojila.
- Pokreni aplikaciju sa Docker Compose:
docker-compose up -d- API će biti dostupan na
http://localhost:8000 - MySQL baza će biti automatski inicijalizovana sa test podacima
- Instaliraj dependencies:
pip install -r requirements.txt- Kopiraj
.env.exampleu.envi podesi konfiguraciju:
cp .env.example .env-
Ažuriraj
.envfajl sa pravim kredencijalima za bazu. -
Kreiraj MySQL bazu i tabele (koristi
init.sqlskripta):
mysql -u root -p < init.sql- Pokreni aplikaciju:
uvicorn main:app --reloadAPI će biti dostupan na http://localhost:8000
FastAPI automatski generiše dokumentaciju:
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc
Upload slika za vodomer.
- Method: POST
- Content-Type: multipart/form-data
- Parameters:
waterMeterId(int, required): ID vodomerafile(file, required): Slika fajl (JPEG, JPG, PNG)
Success (200):
{
"message": "Image uploaded successfully",
"image_id": 1,
"image_url": "/srv/ecitko/uploads/1_20231215_143022_a1b2c3d4.jpg"
}Error (400) - Invalid file format:
{
"detail": "Invalid file format. Allowed formats: JPEG, JPG, PNG"
}Error (404) - Water meter not found:
{
"detail": "Water meter with ID 1 not found or inactive"
}curl -X POST "http://localhost:8000/upload" \
-F "waterMeterId=1" \
-F "file=@meter_reading.jpg"Aplikacija očekuje sledeće tabele:
CREATE TABLE consumers (
id INT PRIMARY KEY AUTO_INCREMENT,
customer_code VARCHAR(50) UNIQUE NOT NULL,
name VARCHAR(255) NOT NULL,
address VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE water_meters (
id INT PRIMARY KEY AUTO_INCREMENT,
consumer_id INT NOT NULL,
meter_code VARCHAR(50) UNIQUE NOT NULL,
location VARCHAR(255),
installation_date DATE,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (consumer_id) REFERENCES consumers(id)
);
CREATE TABLE images (
id INT PRIMARY KEY AUTO_INCREMENT,
water_meter_id INT NOT NULL,
image_url VARCHAR(512) NOT NULL,
processed BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (water_meter_id) REFERENCES water_meters(id)
);
CREATE TABLE readings (
id INT PRIMARY KEY AUTO_INCREMENT,
water_meter_id INT NOT NULL,
reading_value DECIMAL(10,2),
image_path VARCHAR(512),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (water_meter_id) REFERENCES water_meters(id)
);ecitko/
├── main.py # FastAPI aplikacija i endpoint
├── database.py # MySQL konekcija i helper funkcije
├── requirements.txt # Python dependencies
├── .env.example # Primer environment varijabli
├── .gitignore # Git ignore rules
├── Dockerfile # Docker image konfiguracija
├── docker-compose.yml # Docker Compose setup
├── init.sql # MySQL schema i test podaci
└── README.md # Dokumentacija
Za testiranje endpointa, prvo pokreni aplikaciju, a zatim možeš koristiti:
curl -X POST "http://localhost:8000/upload" \
-F "waterMeterId=1" \
-F "file=@meter_reading.jpg"Otvori browser i idi na http://localhost:8000/docs za interaktivnu API dokumentaciju.
- Validacija environment varijabli: Sve neophodne env varijable moraju biti postavljene
- Connection pooling: Thread-safe pristup bazi podataka
- Cursor leak prevention: Svi cursor-i se pravilno zatvaraju
- File size validation: Maksimalna veličina fajla je 5MB
- Filename sanitization: Sprečavanje path traversal napada
- Image content validation: Provera magic bytes za validnost slike
- Error message sanitization: Interni detalji se ne prikazuju korisnicima
- UUID u imenu fajla: Dodatna zaštita od kolizije fajlova
- Chunked file upload: Efikasno upravljanje memorijom