biotech Django & Python

Django 5.2 Proje Başlangıç Yapılandırması: 2026 Best Practices

AK
Ali Kasımoğlu
27 Tem 2022 schedule 4 dk okuma
Django 5.2 Proje {p}Başlangıç Yapılandırması{/p}: 2026 Best Practices
analytics

Insight Density

groups Hedef Kitle: Deneyimli
65 Score

Teknik karmaşıklık ve içerik yoğunluğuna göre hesaplandı.

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
Neredeyse her zaman AbstractUser tercih edin. AbstractUser, Django'nun tüm auth altyapısını (permissions, groups, login, şifre sıfırlama) korur ve üzerine alan eklemenizi sağlar. AbstractBaseUser ise sıfırdan kullanıcı modeli yazmanızı gerektirir — yalnızca username yerine email ile giriş veya tamamen farklı bir auth mantığı istiyorsanız tercih edin.
uv pip ile pip arasındaki fark ne? expand_more
uv, Rust ile yazılmış yeni nesil Python paket yöneticisidir. Pip ile aynı komut arayüzüne sahip ama 10-100x daha hızlı. 'uv pip install django' komutu pip'in kopyası. Aynı zamanda 'uv sync' ile pyproject.toml'dan bağımlılıkları kilitleme ve reproduksibl ortam oluşturma özelliği de var. 2025 itibarıyla Django projelerinde pip'in yerini almaya başladı.
SQLite'tan PostgreSQL'e migration nasıl yapılır? expand_more
1) settings.py'de DATABASE_URL'i PostgreSQL adresine çevirin, 2) python manage.py migrate çalıştırın (şema oluşturur), 3) Mevcut veriyi taşımak için python manage.py dumpdata > data.json ile SQLite'tan dışa aktarın, 4) python manage.py loaddata data.json ile PostgreSQL'e yükleyin. Not: ContentType tablosunu temizleyin (python manage.py flush --no-input) veya --natural-primary --natural-foreign flag'leriyle dumpdata alın.
SECRET_KEY güvenli nasıl üretilir? expand_more
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())" komutuyla güçlü bir key üretin. Üretilen key'i .env dosyasına yazın ve asla git'e commit etmeyin. .gitignore'a .env eklemeyi unutmayın. Production ve staging için farklı key'ler kullanın.
pyproject.toml vs requirements.txt hangisini kullanmalıyım? expand_more
2025 itibarıyla pyproject.toml modern Python standart. Hem paket bağımlılıklarını hem araç konfigürasyonunu (ruff, mypy, pytest) tek dosyada tutar. Ancak Django projeleri için requirements.txt hâlâ yaygın ve production deployment araçları (pip-compile, dependabot) tarafından daha iyi destekleniyor. Basit projeler için requirements.txt yeterli; kütüphane geliştiriyorsanız pyproject.toml şart.
Django 5.2 vs 4.2 LTS: Upgrade etmeli miyim? expand_more
Django 4.2 LTS, Nisan 2026'ya kadar destekleniyor. Yeni proje başlıyorsanız Django 5.2 ile başlayın. Mevcut 4.2 projenizi 5.2'ye taşıyabilirsiniz — büyük breaking change yok ama bağımlı paketlerin (CKEditor, Allauth, DRF) 5.x uyumlu sürümlerini kullandığınızdan emin olun. Her sürüm notası için docs.djangoproject.com/en/5.2/releases/ inceleyin.
LoginRequiredMiddleware nedir, ne işe yarar? expand_more
Django 5.1 ile gelen bu middleware, tüm view'ları varsayılan olarak login gerektiren hale getirir. @login_required dekoratörünü her view'a tek tek eklemek yerine settings.py MIDDLEWARE listesine eklemeniz yeterli. Public olması gereken view'lara @login_not_required dekoratörü ekleyerek login zorunluluğundan muaf tutabilirsiniz.
Etiketler: #Django #Proje Yapısı #Best Practices #django-environ #AbstractUser #PostgreSQL #uv #pyproject.toml
share

Bu Makaleyi Paylaş

Bilgiyi ağınızla paylaşarak bize destek olun.

AK

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.

psychology
psychology

Makale Hakkında Soru Sorun

AnomixAI · Makale içeriğine dayalı yanıtlar

5 soru hakkı
Yalnızca makale içeriği hakkında 0/500
forward_to_inbox

Geleceği Çözümleyin.

Enterprise yapay zeka, yazılım mimarisi ve dijital dönüşüm üzerine aylık brifingi alan 5.000+ mühendis ve kurucuya katılın. Spam yok.