# Instagram Clone API - Detaylı Kılavuz ## 📋 İçindekiler 1. [Proje Yapısı](#proje-yapısı) 2. [Kurulum](#kurulum) 3. [Çalıştırma](#çalıştırma) 4. [Özellikler](#özellikler) 5. [API Endpoints](#api-endpoints) 6. [Veritabanı Modelleri](#veritabanı-modelleri) 7. [Celery & Otomasyonlar](#celery--otomasyonlar) 8. [Admin Paneli](#admin-paneli) 9. [Sorun Giderme](#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 ```bash 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 ```bash pip install -r requirements.txt ``` ### 3. Veritabanı Hazırla ```bash python manage.py makemigrations python manage.py migrate ``` ### 4. Admin Kullanıcısı Oluştur ```bash python manage.py createsuperuser # Email: admin@example.com # Password: *** ``` ### 5. .env Dosyası Oluştur ```bash 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 ```bash source .venv/bin/activate python manage.py runserver # Erişim: http://localhost:8000 ``` ### Terminal 2: Celery Worker ```bash source .venv/bin/activate celery -A core worker -l info ``` ### Terminal 3: Celery Beat (Scheduler) ```bash source .venv/bin/activate celery -A core beat -l info ``` ### Terminal 4: Redis (Gerekli) ```bash 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_until` alanı 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 `TrainingJob` secin, sonra `Action` menusunden 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 + fallback` secenegi otomatik olarak istatistiksel uretime duser. --- ## 🔌 API Endpoints ### **Kimlik Doğrulama (Djoser)** #### Kayıt (Admin Only) ```bash 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 ```bash POST /api/v1/auth/jwt/create/ Content-Type: application/json { "email": "user@example.com", "password": "strongpass123" } # Yanıt { "access": "eyJ0eXAiOiJKV1QiLCJhbGc...", "refresh": "eyJ0eXAiOiJKV1QiLCJhbGc..." } ``` #### Profil Bilgileri ```bash GET /api/v1/auth/users/me/ Authorization: Bearer # 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 ```bash POST /api/v1/ml/train-model/ Authorization: Bearer # 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 ```bash GET /api/v1/ml/training-status/?task_id=550e8400-e29b-41d4-a716-446655440000 Authorization: Bearer # 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)** ```python 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)** ```python 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: ```bash 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:** 1. Veriyi yükle (Iris dataset) 2. Modeli eğit (RandomForest) 3. Metrikleri hesapla 4. ONNX formatına kaydet (versiyonlu) 5. Go servisine bildir ### **Celery Settings (core/settings.py)** ```python 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: ```bash 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_until` tarihi 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? ```bash redis-cli ping # Yanıt: PONG ise OK ``` **Çözüm 2:** Hata logu kontrol et ```bash celery -A core worker -l debug ``` **Çözüm 3:** Database migrations kontrol et ```bash python manage.py migrate ``` --- ### **Problem: Model eğitimi başlamıyor** **Çözüm 1:** Task'ı manuel test et ```bash 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 ```bash 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:** ```bash # 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)** ```bash # 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 " \ -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** ```bash # 1. Eğitim başlat curl -X POST http://localhost:8000/api/v1/ml/train-model/ \ -H "Authorization: Bearer " \ | 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 " \ | 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:latest` kullan. - **Go Servisi:** `.env` dosyasında `GO_SERVICE_URL` tanımlarsan otomatik bildirim yapılır. - **Emails:** Console backend kullanıyor. SMTP konfigürasyonu yapabilirsin. --- ## 📚 Faydalı Commands ```bash # 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