14 KiB
14 KiB
Instagram Clone API - Detaylı Kılavuz
📋 İçindekiler
- Proje Yapısı
- Kurulum
- Çalıştırma
- Özellikler
- API Endpoints
- Veritabanı Modelleri
- Celery & Otomasyonlar
- Admin Paneli
- Sorun Giderme
🏗️ Proje Yapısı
insta/
├── core/ # Django ana ayarları
│ ├── settings.py # Proje konfigürasyonu
│ ├── urls.py # Ana URL router
│ ├── celery.py # Celery app tanımı
│ └── wsgi.py
├── accounts/ # Kullanıcı yönetimi
│ ├── models.py # CustomUser model (active_until ile)
│ ├── views.py # Auth views
│ ├── urls.py # Auth endpoints
│ ├── admin.py # Admin paneli
│ ├── middleware.py # Hesap süresi kontrol
│ ├── tasks.py # Celery görevleri
│ └── migrations/
├── namecreate/ # ML model eğitimi
│ ├── models.py # TrainingJob model
│ ├── views.py # Model eğitim endpoints
│ ├── tasks.py # Eğitim task'ı
│ ├── admin.py # Admin paneli
│ ├── urls.py # ML endpoints
│ └── migrations/
├── db.sqlite3 # Veritabanı (geliştirme)
├── requirements.txt # Python dependencies
└── .env # Ortam değişkenleri
🚀 Kurulum
1. Virtual Environment Oluştur
cd /home/beyhan/Projeler/python/insta
python -m venv .venv
source .venv/bin/activate # Linux/Mac
# veya
.venv\Scripts\activate # Windows
2. Dependencies Yükle
pip install -r requirements.txt
3. Veritabanı Hazırla
python manage.py makemigrations
python manage.py migrate
4. Admin Kullanıcısı Oluştur
python manage.py createsuperuser
# Email: admin@example.com
# Password: ***
5. .env Dosyası Oluştur
cat > .env << EOF
DEBUG=True
SECRET_KEY=your-secret-key-here
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1
# Redis (Celery)
CELERY_BROKER_URL=redis://localhost:6379/5
# Go Servisi (opsiyonel)
GO_SERVICE_URL=http://localhost:8080
# Email
EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend
EOF
⚙️ Çalıştırma
Terminal 1: Django Development Server
source .venv/bin/activate
python manage.py runserver
# Erişim: http://localhost:8000
Terminal 2: Celery Worker
source .venv/bin/activate
celery -A core worker -l info
Terminal 3: Celery Beat (Scheduler)
source .venv/bin/activate
celery -A core beat -l info
Terminal 4: Redis (Gerekli)
redis-server
# veya
docker run -d -p 6379:6379 redis:latest
⭐ Özellikler
1. Admin-Only Kullanıcı Kaydı
- Sadece admin kullanıcılar yeni hesap oluşturabilir
/api/v1/auth/users/- POST (admin only)/api/v1/auth/users/activation/- POST (admin only)/api/v1/auth/users/resend_activation/- POST (admin only)
2. Zamanlı Hesap Aktifliği
- Kullanıcılara sınırlı kullanım süresi verilebilir
active_untilalanı ile kontrol edilir- Otomatik pasife çekilir (middleware + Celery)
3. Model Eğitimi (ML)
- RandomForest modeli eğitilir
- ONNX formatına kaydedilir
- Metrikleri kaydedilir (accuracy, precision, recall, f1)
- Go servisine bildirilir
4. Celery Otomasyonları
- Süresi dolmuş hesapları günlük deaktif etme
- Model eğitimini arka planda yapma
- Database scheduler ile yönetim
5. Admin Panelden Terminalsiz Uretim (2 Mod)
- Terminal erisimi olmadan admin panelden kisi uretimi yapabilirsiniz.
- Yol:
Admin > Namecreate > Training jobs - Bir veya birden fazla
TrainingJobsecin, sonraActionmenusunden secin:Secili job(lar) icin 100 kisi uret (Istatistiksel)Secili job(lar) icin 100 kisi uret (LLM + fallback)Secili job(lar) icin 1000 kisi uret (Istatistiksel)Secili job(lar) icin 1000 kisi uret (LLM + fallback)
- LLM servisi kapaliysa
LLM + fallbacksecenegi otomatik olarak istatistiksel uretime duser.
🔌 API Endpoints
Kimlik Doğrulama (Djoser)
Kayıt (Admin Only)
POST /api/v1/auth/users/
Content-Type: application/json
{
"email": "user@example.com",
"password": "strongpass123",
"re_password": "strongpass123",
"first_name": "John",
"last_name": "Doe"
}
# Yanıt (201 Created)
{
"id": 1,
"email": "user@example.com",
"first_name": "John",
"last_name": "Doe"
}
Login
POST /api/v1/auth/jwt/create/
Content-Type: application/json
{
"email": "user@example.com",
"password": "strongpass123"
}
# Yanıt
{
"access": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"refresh": "eyJ0eXAiOiJKV1QiLCJhbGc..."
}
Profil Bilgileri
GET /api/v1/auth/users/me/
Authorization: Bearer <access_token>
# Yanıt
{
"id": 1,
"email": "user@example.com",
"first_name": "John",
"last_name": "Doe",
"is_active": true,
"date_joined": "2026-03-27T12:00:00Z"
}
ML Model Eğitimi
Eğitim Başlat
POST /api/v1/ml/train-model/
Authorization: Bearer <access_token>
# Yanıt (Task başlatıldı)
{
"status": "queued",
"message": "Model eğitim görevi başlatıldı.",
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"celery_task_id": "abc123xyz"
}
Eğitim Durumunu Sorgula
GET /api/v1/ml/training-status/?task_id=550e8400-e29b-41d4-a716-446655440000
Authorization: Bearer <access_token>
# Yanıt (Tamamlandı)
{
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"created_at": "2026-03-27T12:00:00Z",
"started_at": "2026-03-27T12:00:05Z",
"completed_at": "2026-03-27T12:01:30Z",
"model_version": "2026-03-27T12-00-00",
"metrics": {
"accuracy": 0.96,
"precision": 0.97,
"recall": 0.95,
"f1_score": 0.96
}
}
💾 Veritabanı Modelleri
CustomUser (accounts/models.py)
class CustomUser(AbstractBaseUser, PermissionsMixin):
email # Unique email
first_name # İsim
last_name # Soyisim
is_active # Aktif mi?
is_staff # Admin mi?
is_superuser # Superuser mi?
active_until # ⭐ Hesap bitiş tarihi
date_joined # Kayıt tarihi
last_login # Son giriş
# Metodlar:
is_expired() # Süresi doldu mu?
deactivate_if_expired() # Pasif yap
set_active_for_days(days) # N gün için aktif et
TrainingJob (namecreate/models.py)
class TrainingJob(models.Model):
task_id # Celery task ID
status # pending, running, completed, failed
model_type # Model tipi (RandomForest)
model_version # Timestamp (versiyonlama)
model_path # Dosya yolu
# Metrikleri
accuracy # Doğruluk
precision # Kesinlik
recall # Geri çağırma
f1_score # F1 skoru
# Zaman damgaları
created_at # Oluşturulma
started_at # Başlama
completed_at # Tamamlanma
# Go Servisi
go_service_notified # Bildirildi mi?
# Hata
error_message # Hata mesajı
🤖 Celery & Otomasyonlar
Otomatik Prosesler
1. Süresi Dolmuş Hesapları Deaktif Etme
Periyodiklik: Her 24 saatte 1 kez
Task: accounts.tasks.deactivate_expired_users_task()
Veritabanı: active_until <= now() olan users pasif olur
Manuel çalıştırmak:
python manage.py deactivate_expired_users
2. Model Eğitimi
Periyodiklik: İsteğe bağlı (manual trigger)
Task: namecreate.tasks.train_model_task(task_id)
İşler:
- Veriyi yükle (Iris dataset)
- Modeli eğit (RandomForest)
- Metrikleri hesapla
- ONNX formatına kaydet (versiyonlu)
- Go servisine bildir
Celery Settings (core/settings.py)
CELERY_BROKER_URL = 'redis://localhost:6379/5'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
CELERY_BEAT_SCHEDULE = {
'deactivate-expired-users-daily': {
'task': 'accounts.tasks.deactivate_expired_users_task',
'schedule': 60 * 60 * 24, # Her 24 saat
},
}
Task Monitoring
Celery Flower ile gerçek zamanlı monitoring:
pip install flower
celery -A core flower
# Erişim: http://localhost:5555
👨💼 Admin Paneli
Admin Erişimi
http://localhost:8000/admin/
Email: admin@example.com
Şifre: ***
Admin Sayfalarında Neleri Yönetebilirsin?
1. Kullanıcılar (/admin/accounts/customuser/)
- Yeni kullanıcı oluştur
active_untiltarihi belirle- Hesabı aktif/pasif yap
- Filtreleme: İçinden çıkış tarihi, aktif durum, staff status
2. Eğitim Görevleri (/admin/namecreate/trainingjob/)
- Tüm eğitim görevlerini görüntüle
- Status takibi: pending → running → completed/failed
- Metrikleri kontrol et (accuracy, f1, vb.)
- Error loglarını göster (başarısız task'lar)
- Go servisine bildirilip bildirilmediğini kontrol et
3. Periyodik Görevler (/admin/django_celery_beat/periodictask/)
- Celery Beat task'larını yönet
- Schedule'ı özelleştir
- Yeni periyodik görev ekle
🔍 Sorun Giderme
Problem: Celery Worker hata veriyor
Çözüm 1: Redis çalışıyor mu?
redis-cli ping
# Yanıt: PONG ise OK
Çözüm 2: Hata logu kontrol et
celery -A core worker -l debug
Çözüm 3: Database migrations kontrol et
python manage.py migrate
Problem: Model eğitimi başlamıyor
Çözüm 1: Task'ı manuel test et
python manage.py shell
>>> from namecreate.tasks import train_model_task
>>> task_id = 'test-123'
>>> from namecreate.models import TrainingJob
>>> job = TrainingJob.objects.create(task_id=task_id)
>>> result = train_model_task.delay(task_id)
>>> result.get()
Çözüm 2: Worker loglarını kontrol et (celery -A core worker -l info)
Problem: Admin panelinde TrainingJob görmüyorum
Çözüm: Migration'ı çalıştır
python manage.py migrate namecreate
Problem: Djoser endpoints 403 Forbidden dönem
Sebep: Admin değilsin (register/activation admin-only'dir)
- Admin kullanıcı ile yapabilirsin
- Veya superuser token'ı kullan
Test:
# Superuser ile
TOKEN=$(curl -X POST http://localhost:8000/api/v1/auth/jwt/create/ \
-H "Content-Type: application/json" \
-d '{"email":"admin@example.com","password":"***"}' | jq -r '.access')
curl -X POST http://localhost:8000/api/v1/auth/users/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email":"newuser@example.com",
"password":"pass123",
"re_password":"pass123"
}'
📊 Örnek İş Akışı
Senaryo 1: Yeni Kullanıcı Ekleme (Admin)
# 1. Admin token al
curl -X POST http://localhost:8000/api/v1/auth/jwt/create/ \
-H "Content-Type: application/json" \
-d '{"email":"admin@example.com","password":"adminpass123"}' \
| jq .
# Response: access token vs refresh token
# 2. Yeni kullanıcı oluştur
curl -X POST http://localhost:8000/api/v1/auth/users/ \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"email":"john@example.com",
"password":"johnpass123",
"re_password":"johnpass123",
"first_name":"John",
"last_name":"Doe"
}'
# 3. Admin panelinden active_until tarihi belirle
# http://localhost:8000/admin/accounts/customuser/
# John'ın profiline gir → active_until = 2026-04-27 (30 gün başlar)
# 4. 30 gün sonra otomatik pasif olur
Senaryo 2: Model Eğitimi
# 1. Eğitim başlat
curl -X POST http://localhost:8000/api/v1/ml/train-model/ \
-H "Authorization: Bearer <TOKEN>" \
| jq .
# Response: task_id = "550e8400-e29b-41d4-a716-446655440000"
# 2. Durum sorgula (5-10 saniye sonra)
curl http://localhost:8000/api/v1/ml/training-status/?task_id=550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer <TOKEN>" \
| jq .
# 3. Tamamlanınca:
# - Model: media/models/iris_model_2026-03-27_12-30-45.onnx
# - Metrikler: accuracy=0.96, f1=0.96
# - Go servisi bilgilendirildi (varsa)
📝 Notlar
- Geliştirme: SQLite kullanıyor. Production'da PostgreSQL kullan.
- Redis: Celery için gerekli. Docker'da
redis:latestkullan. - Go Servisi:
.envdosyasındaGO_SERVICE_URLtanımlarsan otomatik bildirim yapılır. - Emails: Console backend kullanıyor. SMTP konfigürasyonu yapabilirsin.
📚 Faydalı Commands
# Veritabanı işlemleri
python manage.py makemigrations
python manage.py migrate
python manage.py flush # Tüm veriyi sil (DİKKAT!)
# Shell (Python repl)
python manage.py shell
# Superuser oluştur
python manage.py createsuperuser
# Celery test
python manage.py celery -A core worker -l info
# Datab Shell (SQL)
python manage.py dbshell
# Yeni app oluştur
python manage.py startapp appname
🎯 Sonraki Adımlar
- PostgreSQL kurulumu
- Production settings
- Docker containerization
- CI/CD pipeline (GitHub Actions)
- Monitoring & logging
- API Rate limiting
- WebSocket entegrasyonu (asenkron güncellemeler)
Hazırlandı: 27 Mart 2026
Versiyon: 1.0