Przejdź do głównej zawartości

LinkShort

🧪 Zobacz animowane wyniki testów — 15/15 →

Produkcyjny skracacz URL — backend FastAPI, auth JWT, śledzenie kliknięć, SPA React 19, SQLite.

LinkShort (repozytorium: FastAPI-url) to kompletny serwis do skracania URL-i: API w Pythonie/FastAPI, autoryzacja JWT, zarządzanie linkami per użytkownik, statystyki kliknięć oraz serwowana aplikacja single-page w React.

Stos: FastAPI (Python) · SQLAlchemy · SQLite · JWT (python-jose) · React 19 SPA (pliki statyczne serwowane przez FastAPI) · pytest

Najważniejsze cechy

  • Pełny przepływ auth — rejestracja → logowanie → tokeny bearer JWT; /auth/me zwraca bieżącego użytkownika
  • 6-znakowe kody skrótów — kryptograficznie losowe (secrets), z ponawianiem przy kolizji
  • Śledzenie kliknięć — każdy redirect zwiększa licznik kliknięć
  • URL-e per użytkownik/urls/my listuje Twoje linki; usuwanie tylko przez właściciela
  • Przekierowania 302/urls/r/{code} przekierowuje do celu z zapisaniem kliknięcia
  • Publiczne statystyki/urls/{code}/stats zwraca cel + liczbę kliknięć
  • Serwowanie SPA — FastAPI montuje zbudowaną aplikację React i fallbackuje do index.html dla routingu po stronie klienta
  • Otwarty CORSallow_origins=["*"] na czas rozwoju

Stos technologiczny

WarstwaTechnologia
APIFastAPI (app = FastAPI(title="URL Shortener", version="1.0.0"))
ORMSQLAlchemy (Base.metadata.create_all przy starcie)
Baza danychSQLite
AuthTokeny bearer JWT (python-jose)
Haszowanie hasełapp/auth.py (hashowane, nigdy nie w plaintekście)
FrontendSPA React 19 w backend/static/
Testypytest (tests/test_api.py)

Powierzchnia API

MetodaŚcieżkaAuthOpis
POST/auth/registerUtwórz konto, otrzymaj JWT
POST/auth/loginUwierzytelnij, otrzymaj JWT
GET/auth/meBearerProfil bieżącego użytkownika
POST/urls/shortenBearerSkróć URL
GET/urls/myBearerLista Twoich URL-i (najnowsze pierwsze)
GET/urls/{code}/statsPubliczne statystyki kliknięć
DELETE/urls/{code}BearerUsuń swój URL (tylko właściciel)
GET/urls/r/{code}Przekierowanie 302 + licznik kliknięć
GET/healthSonda żywotności

Struktura repozytorium

FastAPI-url/
├── app/
│ ├── main.py # Aplikacja FastAPI, CORS, serwowanie SPA
│ ├── auth.py # Tworzenie/weryfikacja JWT, haszowanie haseł
│ ├── database.py # Silnik SQLAlchemy + sesja
│ ├── models.py # Modele User, URL
│ ├── schemas.py # Schematy Pydantic (UserCreate, Token, URLOut, URLStats)
│ ├── config.py # Ustawienia
│ └── routers/
│ ├── auth_router.py # Endpointy /auth/*
│ └── urls.py # Endpointy /urls/*
├── backend/static/ # Zbudowane SPA React (serwowane przez FastAPI)
├── tests/
│ └── test_api.py # Testy integracyjne API
└── ...

Generowanie krótkiego kodu

def gen_short() -> str:
chars = string.ascii_letters + string.digits
return ''.join(secrets.choice(chars) for _ in range(6))

6 znaków z alfabetu 62-znakowego ≈ 5,7×10¹⁰ kombinacji; kolizje są sprawdzane i ponawiane względem bazy danych.

Powiązane strony