Overview
FKApi is a Django REST API built to provide structured access to football kit data. The system follows a layered architecture pattern with clear separation of concerns across presentation, business logic, and data access layers.Architecture Diagram
Core Components
1. Client Layer
The entry point for all external interactions:- Web browsers accessing the API
- Mobile applications
- Third-party API clients
- API testing tools (Postman, cURL)
2. URL Routing
Django’s URL dispatcher maps incoming requests to appropriate endpoints:- Defined in
fkapi/urls.py - Routes API requests to Django Ninja endpoints
- Handles admin interface routing
3. Middleware Layer
Two custom middleware components provide cross-cutting functionality:Rate Limiting Middleware
Rate Limiting Middleware
Prevents API abuse by limiting requests per IP address:
- Tracks request counts per IP
- Configurable rate limits
- Whitelist support via
API_RATE_LIMIT_WHITELIST - Returns 429 status code when limits exceeded
Performance Monitoring Middleware
Performance Monitoring Middleware
Monitors application performance:
- Tracks response times
- Logs slow queries (threshold:
SLOW_QUERY_THRESHOLD) - Identifies slow responses (threshold:
SLOW_RESPONSE_THRESHOLD) - Optional database query logging via
LOG_DB_QUERIES
4. API Layer (Django Ninja)
Django Ninja provides a modern, FastAPI-style API framework:- RESTful endpoint definitions
- Automatic request validation using Pydantic
- Response serialization
- OpenAPI/Swagger documentation generation
- Type-safe API development
5. Service Layer
Business logic lives in service classes undercore/services/:
- ScrapingService: Orchestrates web scraping operations
- KitsService: Handles kit-related business logic
- ClubsService: Manages club operations
- Testable business logic
- Reusable components across endpoints
- Clear separation of concerns
6. Data Access Layer
Django ORM provides database abstraction:- Model definitions in
core/models.py - Query optimization with
select_related()andprefetch_related() - Database indexes on frequently queried fields
- Transaction management
7. Data Storage
PostgreSQL Database
Primary data store for all structured data:
- Clubs, Kits, Seasons
- Brands, Competitions
- Colors and Variations
- Connection pooling enabled (
CONN_MAX_AGE: 60) - Keepalive settings for connection stability
Redis Cache
Optional caching layer:
- Reduces database load
- Stores API responses
- Cache timeout configurations (5m to 24h)
- Automatically enabled when Celery is active
- Falls back to local memory cache if unavailable
Images (kit photos, logos) are stored as URLs pointing to footballkitarchive.com, not served locally.
Data Flow
API Request Flow
Scraping Data Flow
The scraping process ingests data from footballkitarchive.com:- Trigger: Management command or Celery task initiates scraping
- HTTP Request:
http_get()fetches page with retry logic and proxy support - HTML Parsing: BeautifulSoup4 extracts structured data from HTML
- Data Processing: Service layer validates and transforms data
- Database Save: ORM creates or updates records within transactions
- Cache Invalidation: Django signals clear affected cache entries
Design Patterns
Service Layer Pattern
Separates business logic from presentation layer:- Located in
core/services/ - Promotes code reusability
- Enhances testability
- Example:
ScrapingService.process_kit_data()
Repository Pattern
Implemented via Django ORM:- Data access abstraction
- Custom model managers for complex queries
- Query optimization methods
Middleware Pattern
Handles cross-cutting concerns:- Rate limiting applies to all requests
- Performance monitoring on every response
- Executes before and after view processing
Signal Pattern
Event-driven cache invalidation:- Django signals trigger on model changes
- Automatic cache clearing on save/delete
- Maintains cache consistency
Factory Pattern
Configurable object creation:- HTTP session creation with proxy support
- Scraper configuration based on environment
Technology Stack
Django 5.0
Web framework
Django Ninja
REST API framework
PostgreSQL
Primary database
Redis
Cache layer
Celery
Task queue (optional)
BeautifulSoup4
HTML parsing
Configuration
Key environment variables fromsettings.py:
| Variable | Purpose | Default |
|---|---|---|
DJANGO_DEBUG | Debug mode | True |
DJANGO_SECRET_KEY | Security key | Auto-generated in dev |
DJANGO_ALLOWED_HOSTS | Allowed hosts | localhost,127.0.0.1 |
ENABLE_CELERY | Enable task queue | Based on availability |
USE_REDIS_CACHE | Use Redis for caching | False |
SLOW_QUERY_THRESHOLD | Slow query threshold (seconds) | 0.5 |
SLOW_RESPONSE_THRESHOLD | Slow response threshold (seconds) | 1.0 |
API_RATE_LIMIT_WHITELIST | Whitelisted IPs | None |
Performance Optimizations
Caching Strategy
Caching Strategy
Multi-tier caching with configurable timeouts:
CACHE_TIMEOUT_SHORT: 5 minutesCACHE_TIMEOUT_MEDIUM: 30 minutesCACHE_TIMEOUT_LONG: 1 hourCACHE_TIMEOUT_VERY_LONG: 24 hours
Database Optimization
Database Optimization
- Connection pooling (
CONN_MAX_AGE: 60) - Keepalive settings for connection stability
- Indexes on frequently queried fields
select_related()andprefetch_related()for joins
Query Optimization
Query Optimization
- Database indexes on:
- Club: name, country, slug
- Kit: name, team+season, main_img_url, rating
- Type_K: category_order, is_goalkeeper, order_priority
- Competition: name, country
Security Features
- Rate Limiting: Prevents API abuse
- Optional API Key Authentication: Via
ninja-apikey - SQL Injection Protection: Django ORM parameterized queries
- XSS Protection: Django template escaping
- CSRF Protection: Enabled for admin, disabled for API endpoints
- Secure Headers: In production mode:
SECURE_SSL_REDIRECTSESSION_COOKIE_SECURECSRF_COOKIE_SECURESECURE_HSTS_SECONDS: 1 yearX_FRAME_OPTIONS: DENY
Deployment Architecture
Multiple Django application instances can run behind a load balancer. Redis ensures cache consistency across instances.