Son güncelleme: Nisan 2026 · AnomixLabs Teknik Ekibi
Bir Django projesinin ilk saatlerinde alınan kararlar, aylarca süren geliştirme sürecini doğrudan etkiler. Doğru başlamak, sonradan yeniden yazmaktan her zaman daha ucuzdur.
1. Django 5.2 LTS Neden?
Django 5.2, Nisan 2025'te yayınlanan Long-Term Support (LTS) sürümüdür ve 2028 yılına kadar güvenlik güncellemesi alacaktır. Üretim projeleri için her zaman LTS sürümü tercih edin — bağımlı paketlerinizin her major Django sürümüne adapte olmasını beklemek yerine kararlı temelde çalışın.
Django 5.2'nin öne çıkan yenilikleri: Composite primary key desteği, LoginRequiredMiddleware (tüm view'lara tek satırda login zorunluluğu), ASGI performans iyileştirmeleri ve geliştirilmiş AsyncClient.
2. Kurulum: uv (Önerilen) veya pip
uv, Rust ile yazılmış ve pip'ten 10-100x daha hızlı bir Python paket yöneticisidir. 2024-2025'te Python ekosisteminin standart aracı haline geldi:
# Seçenek A: uv (önerilen)
$ pip install uv
$ uv venv .venv
$ source .venv/bin/activate # Windows: .venv\Scripts\activate
$ uv pip install django==5.2
# Seçenek B: klasik pip
$ python -m venv .venv
$ source .venv/bin/activate
$ pip install django==5.2
# Proje oluştur
$ django-admin startproject config .
$ python manage.py startapp accounts
3. Custom User Model — İlk ve En Kritik Adım
Django'nun en önemli best practice'i: ilk migrate'den önce özel kullanıcı modeli tanımlayın. Sonradan yapmak migration cehennemi anlamına gelir — mevcut auth tabloları, foreign key ilişkileri ve permission yapısı tamamen bozulur. Deneyimlerimizde bu hatayı yapan her proje ciddi refactoring maliyetiyle karşılaştı:
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
# Şimdilik sadece 2 alan — ileride kolayca genişler
phone = models.CharField(max_length=20, blank=True)
avatar = models.ImageField(upload_to='avatars/', blank=True)
class Meta:
verbose_name = 'Kullanıcı'
verbose_name_plural = 'Kullanıcılar'
AUTH_USER_MODEL = 'accounts.User'
4. django-environ ile .env Yönetimi
SECRET_KEY, veritabanı şifresi ve API anahtarları gibi hassas bilgileri asla kaynak koduna yazmayın. django-environ bu bilgileri .env dosyasından okur:
$ pip install django-environ
SECRET_KEY=django-insecure-degistirin-bunu
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1
DATABASE_URL=postgres://user:pass@localhost:5432/mydb
EMAIL_HOST_USER=ornek@gmail.com
EMAIL_HOST_PASSWORD=uygulama-sifresi
import environ
env = environ.Env(DEBUG=(bool, False))
environ.Env.read_env(BASE_DIR / '.env')
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=['*'])
DATABASES = {'default': env.db()}
5. Önerilen Klasör Yapısı
myproject/
├── config/ # settings, urls, wsgi, asgi
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── apps/
│ ├── accounts/ # Custom User model — ilk app
│ ├── blog/
│ │ ├── models/
│ │ │ ├── __init__.py
│ │ │ └── article.py
│ │ ├── views/
│ │ └── tests/
│ └── core/ # Ortak utility'ler
├── static/
├── media/
├── templates/
├── locale/
├── .env
├── .gitignore
└── manage.py
6. Tam settings.py Organizasyonu
# ── CORE ────────────────────────────────────────
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
# ── APPS ────────────────────────────────────────
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'apps.accounts',
'apps.blog',
]
# ── DATABASE ─────────────────────────────────────
DATABASES = {'default': env.db()}
# ── AUTH ─────────────────────────────────────────
AUTH_USER_MODEL = 'accounts.User'
# ── STATIC & MEDIA ───────────────────────────────
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
STATIC_ROOT = BASE_DIR / 'staticfiles'
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
# ── EMAIL ────────────────────────────────────────
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
7. PostgreSQL Kurulumu
# Ubuntu/Debian
$ sudo apt install postgresql postgresql-contrib libpq-dev
$ sudo -u postgres psql
CREATE DATABASE mydb;
CREATE USER myuser WITH PASSWORD 'mypassword';
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
\q
# Python bağlantısı
$ pip install psycopg2-binary
# İlk migration
$ python manage.py migrate
8. Pre-Commit Hooks
Her commit öncesinde kod kalitesini otomatik kontrol eden araçlar. ruff (linter + formatter) ve mypy (tip kontrolü) ile:
$ pip install pre-commit ruff mypy
$ pre-commit install
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.3.0
hooks:
- id: ruff
args: [--fix]
- id: ruff-format
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-merge-conflict
- id: check-env-vars
args: [--no-empty-required]
9. Güvenlik Checklist
# Django yerleşik güvenlik denetimi
$ python manage.py check --deploy
# Tipik output:
# WARNINGS:
# ?: (security.W004) You have not set SECURE_HSTS_SECONDS...
# ?: (security.W008) SECURE_SSL_REDIRECT setting is not set...
# HTTPS güvenlik ayarları (DEBUG=False ortamında)
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000 # 1 yıl
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_CONTENT_TYPE_NOSNIFF = True
10. Staging / Production Ortam Ayrımı
Tek bir settings.py yerine ortam bazlı dosyalar kullanmak büyük projelerde esneklik sağlar:
config/
├── settings/
│ ├── __init__.py
│ ├── base.py # Ortak ayarlar
│ ├── local.py # Geliştirme (DEBUG=True, SQLite)
│ ├── staging.py # Test sunucusu
│ └── production.py # Canlı (DEBUG=False, PostgreSQL)
# Ortam değişkeniyle geçiş
DJANGO_SETTINGS_MODULE=config.settings.production python manage.py migrate
# .env dosyasında
DJANGO_SETTINGS_MODULE=config.settings.local
Özet
Django 5.2 LTS projesi kurmak için sıralama: AbstractUser (ilk migrate öncesi), django-environ (.env yönetimi), modüler settings (base/local/production), PostgreSQL (production standardı), pre-commit (kod kalitesi), güvenlik checklist (python manage.py check --deploy). Bu 6 adım projenizin sağlıklı temeli.
Sıkça Sorulan Sorular
AbstractUser mı AbstractBaseUser mı kullanmalıyım? expand_more
uv pip ile pip arasındaki fark ne? expand_more
SQLite'tan PostgreSQL'e migration nasıl yapılır? expand_more
SECRET_KEY güvenli nasıl üretilir? expand_more
pyproject.toml vs requirements.txt hangisini kullanmalıyım? expand_more
Django 5.2 vs 4.2 LTS: Upgrade etmeli miyim? expand_more
LoginRequiredMiddleware nedir, ne işe yarar? expand_more
Ali Kasımoğlu
Full-stack Geliştirici & AnomixLabs Kurucusu
Python ve Django ekosisteminde uzmanlaşmış bir yazılım geliştirici. Modern web mimarileri, yapay zeka entegrasyonları ve minimalist kullanıcı deneyimleri üzerine odaklanıyor. AnomixLabs çatısı altında, karmaşık problemleri yalın ve etkili dijital çözümlere dönüştürmeyi hedefliyor.