2.7 KiB
2.7 KiB
Technology Stack
Backend
- Framework: FastAPI (Python web framework)
- ORM: SQLAlchemy
- Database: SQLite (vfx_project_management.db)
- Authentication: JWT tokens (access + refresh)
- Validation: Pydantic schemas
- Password Hashing: passlib with bcrypt
- File Handling: python-multipart, Pillow
Frontend
- Framework: Vue 3 with Composition API
- Language: TypeScript
- Build Tool: Vite
- Styling: Tailwind CSS
- UI Components: shadcn-vue (based on Radix UI)
- State Management: Pinia stores
- Routing: Vue Router with navigation guards
- HTTP Client: Axios with interceptors
- Icons: lucide-vue-next
Common Commands
Backend (from /backend directory)
# Start development server
uvicorn main:app --reload --host 0.0.0.0 --port 8000
# Create virtual environment
python -m venv venv
# Activate virtual environment (Windows)
venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Database utilities
python create_fresh_database.py
python create_admin.py
python create_example_data.py
Frontend (from /frontend directory)
# Start development server
npm run dev
# Build for production
npm run build
# Type checking
npm run type-check
# Install dependencies
npm install
API Documentation
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
Development Ports
- Backend: http://localhost:8000
- Frontend: http://localhost:5173
Important: FastAPI Trailing Slash Issue
CRITICAL: When adding or modifying API routes, always ensure trailing slashes match between frontend and backend to avoid 307 redirects that lose authentication headers.
The Problem
- FastAPI redirects requests when trailing slashes don't match route definitions
- HTTP 307 redirects do NOT preserve the
Authorizationheader - This causes authenticated requests to fail with 403 Forbidden
The Solution
Always match trailing slashes between frontend API calls and backend route definitions:
// Frontend - WITH trailing slash for query params
apiClient.get(`/tasks/?shot_id=12`)
// Backend - Route defined WITH trailing slash
@router.get("/tasks/")
// Frontend - WITHOUT trailing slash for path params
apiClient.get(`/tasks/${taskId}`)
// Backend - Route defined WITHOUT trailing slash
@router.get("/tasks/{task_id}")
Quick Check
Look for these patterns in backend logs:
❌ BAD (redirect happening):
INFO: "GET /tasks?shot_id=12 HTTP/1.1" 307 Temporary Redirect
INFO: "GET /tasks/?shot_id=12 HTTP/1.1" 403 Forbidden
✅ GOOD (no redirect):
INFO: "GET /tasks/?shot_id=12 HTTP/1.1" 200 OK
See: backend/docs/fastapi-trailing-slash-issue.md for complete documentation.