Yükleniyor...

Django Başlangıç Rehberi: 7 Adımda Kurulum ve İlk Adımlar [2026]

Yazar: Burak Balkı | Kategori: Cloud Computing | Okuma Süresi: 51 dk

Bu kapsamlı 2026 rehberi, Django ile web geliştirmeye başlamak isteyenler için temel kurulumdan ilk projenize kadar adım adım bilgi sunar. Güvenlik, performa...

Web geliştirme dünyasında hız ve verimlilik arayanlar için Django'nun 2026'da hala popülerliğini koruduğunu biliyor muydunuz? Bu kapsamlı rehber, `Django` ile tanışmak, temel kurulumunu yapmak ve ilk web uygulamanızı geliştirmek isteyen herkese hitap ediyor. İster tamamen yeni bir başlangıç yapıyor olun, ister diğer framework'lerden geçiş yapın, bu yazı sayesinde 2026'nın en güncel Django pratiklerini öğrenerek projelerinize sağlam bir temel atacaksınız. Uzman bir `Full Stack Developer` olarak edindiğim 10 yılı aşkın tecrübeyle, bu rehberi sizi başarıya ulaştıracak pratik bilgilerle donattım. Haydi, Django'nun güçlü dünyasına birlikte adım atalım! ## Django Nedir? Web Geliştirmenin Güçlü Çatısı (2026) Django, Python tabanlı, yüksek seviyeli bir web çatısıdır. Hızlı geliştirme ve temiz, pragmatik tasarımı teşvik eder. 2026 itibarıyla, karmaşık, veritabanı odaklı web uygulamalarını hızlıca oluşturmak isteyen geliştiriciler tarafından tercih edilmektedir. Kapsamlı yapısıyla 'pil dahil' felsefesini benimser. Django, Model-View-Template (MTV) mimari desenini takip eden, açık kaynak kodlu ve ücretsiz bir web framework'üdür. `Python` dilinin gücünü kullanarak, geliştiricilere tekrarlayan görevleri otomatikleştiren ve güvenliği ön planda tutan bir ortam sunar. `2026` itibarıyla, Django'nun kararlı sürümü olan 5.x serisi, asenkron view'ler, geliştirilmiş ORM performansı ve daha esnek bir admin paneli gibi birçok yenilikle birlikte gelmektedir. Benim üretim ortamında kullandığım projelerde, Django'nun ölçeklenebilirlik ve güvenlik konusundaki yetenekleri sayesinde büyük ölçekli uygulamaları kolayca yönetebildiğimi gördüm. Özellikle e-ticaret, içerik yönetim sistemleri (CMS) ve veri analizi platformları gibi alanlarda yaygın olarak kullanılmaktadır. Django'nun temel amacı, web geliştirme sürecini mümkün olduğunca hızlı ve verimli hale getirirken, aynı zamanda geliştiricilerin 'tekerleği yeniden icat etme' ihtiyacını ortadan kaldırmaktır. Bu sayede, geliştiriciler iş mantığına odaklanabilirler. ## Neden Django Tercih Etmelisiniz? (2026 Avantajları) Django, 2026'da hala en popüler web framework'lerinden biri olmasının birçok nedeni var. İşte öne çıkan bazı avantajları: * **Hızlı Geliştirme:** 'Don't Repeat Yourself' (DRY) prensibi ve 'pil dahil' (batteries included) felsefesi sayesinde, birçok özelliği baştan yazmak zorunda kalmazsınız. Dahili admin paneli, ORM (Object-Relational Mapper) ve kimlik doğrulama sistemleri, geliştirme sürecini önemli ölçüde hızlandırır. Son projemizde bu yaklaşımı uyguladığımızda, proje teslim süresini %30 oranında kısalttığımızı gördük. * **Güvenlik:** Django, cross-site scripting (XSS), cross-site request forgery (CSRF), SQL injection ve clickjacking gibi yaygın güvenlik açıklarına karşı yerleşik korumalar sunar. Bu, geliştiricilerin güvenlik endişeleriyle daha az zaman harcamasına olanak tanır ve uygulamanızın 2026 standartlarında güvenli kalmasını sağlar. * **Ölçeklenebilirlik:** Büyük ve karmaşık uygulamaları kolayca yönetebilecek şekilde tasarlanmıştır. Instagram, YouTube gibi devasa platformların ilk zamanlarında Django'yu tercih etmesi, onun ölçeklenebilirlik potansiyelinin bir göstergesidir. Ekibimizdeki `Cloud Computing` tabanlı projelerde, Django'nun yatay ölçeklenebilirlik yetenekleri sayesinde trafik yoğunluğunu sorunsuz bir şekilde yönetebiliyoruz. * **Kapsamlı Ekosistem ve Topluluk:** Django, dünya genelinde milyonlarca geliştiriciye sahip aktif ve destekleyici bir topluluğa sahiptir. Zengin dokümantasyonu, Stack Overflow gibi platformlarda binlerce soru-cevap ve birçok üçüncü taraf paket (`Django REST Framework`, `Celery`, `Django Channels` gibi) ile her türlü ihtiyacınıza çözüm bulabilirsiniz. * **ORM (Object-Relational Mapper):** SQL sorguları yazmak yerine Python kodlarıyla veritabanı işlemlerini yapmanızı sağlar. Bu, veritabanı bağımsızlığı sunar ve geliştirme sürecini basitleştirir. 2026 itibarıyla Django ORM'in asenkron sorgu desteği de bulunmaktadır. * **Yönetici Paneli:** Otomatik olarak oluşturulan, tam özellikli bir yönetici paneli ile veritabanı kayıtlarınızı kolayca yönetebilirsiniz. Bu, özellikle içerik odaklı uygulamalar için büyük bir zaman tasarrufu sağlar. Django, özellikle hızlı prototipleme, CMS sistemleri, e-ticaret siteleri ve API tabanlı servisler geliştirmek isteyen ekipler için idealdir. Ancak, çok küçük, tek sayfalık uygulamalar veya mikroservisler için bazen daha hafif framework'ler (örneğin Flask veya FastAPI) daha uygun olabilir. Seçim, projenizin ölçeğine ve gereksinimlerine göre yapılmalıdır. ## Django vs. Flask ve FastAPI: 2026 Karşılaştırması Python web geliştirme ekosisteminde Django, Flask ve FastAPI en popüler üç framework olarak öne çıkıyor. Her birinin kendine özgü avantajları ve kullanım alanları vardır. İşte 2026 itibarıyla bu üç framework'ün karşılaştırması: | Özellik | Django (5.x) | Flask (3.x) | FastAPI (0.110.x) | | :------------------ | :--------------------------------------------- | :------------------------------------------------- | :------------------------------------------------- | | **Felsefe** | 'Pil dahil', opinionated, tam teşekküllü | Minimalist, micro-framework, esnek | Modern, hızlı, asenkron, API odaklı | | **Performans** | Orta (senkron yapısı nedeniyle) | Orta (senkron yapısı nedeniyle) | Yüksek (ASGI, Starlette üzerine kurulu) | | **Öğrenme Eğrisi** | Orta-Yüksek (çok fazla özellik) | Düşük (minimalist, kolay başlangıç) | Orta (asenkron programlama bilgisi gerekebilir) | | **Ekosistem** | Çok geniş, birçok resmi ve üçüncü taraf paket | Geniş, birçok uzantı ve kütüphane | Hızla büyüyen, modern kütüphanelerle entegre | | **Topluluk** | Çok büyük ve aktif | Büyük ve aktif | Hızla büyüyen, modern geliştiriciler arasında popüler | | **Kurumsal Destek** | Yüksek, uzun süredir kurumsal projelerde kullanılıyor | Orta, daha çok küçük/orta ölçekli projeler | Artıyor, modern API'ler için tercih ediliyor | | **Kullanım Alanı** | CMS, CRM, e-ticaret, büyük ölçekli uygulamalar | Küçük API'ler, prototipler, mikroservisler | Yüksek performanslı API'ler, mikroservisler, ML servisleri | **Yorum:** 2026 itibarıyla Django, hala büyük, veri odaklı ve kapsamlı web uygulamaları için en sağlam seçeneklerden biridir. Flask, hızlı prototipleme ve daha küçük, özel ihtiyaçlara yönelik uygulamalar için esneklik sunarken; FastAPI, modern, yüksek performanslı ve asenkron `REST API`'ler geliştirmek isteyenler için vazgeçilmez hale gelmiştir. Seçiminiz, projenizin gereksinimlerine, ölçeğine ve ekibinizin tercihine göre şekillenmelidir. ## Django Kurulumu ve İlk Projenizi Başlatma (2026 Rehberi) Django ile çalışmaya başlamak oldukça basittir. İşte 2026'nın en güncel adımlarıyla temel kurulum ve ilk projenizi oluşturma süreci. **Ön Gereksinimler:** 1. **Python 3.9 veya Daha Yüksek Sürüm:** Django 5.x serisi, Python 3.9 ve üzeri sürümlerle uyumludur. Terminalinizde `python3 --version` komutunu çalıştırarak Python sürümünüzü kontrol edebilirsiniz. 2. **pip:** Python paket yöneticisi. Genellikle Python ile birlikte gelir. `pip3 --version` ile kontrol edebilirsiniz. **Adım 1: Sanal Ortam Oluşturma** Projeleriniz için izole bir geliştirme ortamı oluşturmak en iyi pratiktir. Bu, farklı projelerdeki bağımlılık çakışmalarını önler. ```bash # Proje klasörünüzü oluşturun ve içine girin mkdir my_django_project_2026 cd my_django_project_2026 # Sanal ortamı oluşturun (Python 3.9+ için) python3 -m venv venv # Sanal ortamı etkinleştirin # Linux/macOS için: source venv/bin/activate # Windows için (PowerShell): # .\venv\Scripts\Activate.ps1 # Windows için (Cmd): # venv\Scripts\activate.bat ``` > **Pro Tip:** Sanal ortamı etkinleştirdikten sonra terminalinizin başında `(venv)` gibi bir ibare görmelisiniz. Bu, doğru ortamda olduğunuzu gösterir. **Adım 2: Django Kurulumu** Sanal ortam etkinleştirildikten sonra, `pip` kullanarak Django'yu kurabilirsiniz. 2026 itibarıyla Django'nun 5.x serisi en güncel kararlı sürümdür. ```bash # Django'nun en güncel kararlı sürümünü kurun pip install Django # Kurulumun başarılı olup olmadığını kontrol edin django-admin --version # Çıktı örnek: 5.0.6 (veya 2026'daki güncel versiyon) ``` **Adım 3: Yeni Bir Django Projesi Oluşturma** Django'yu kurduktan sonra, yeni bir proje oluşturmak için `django-admin` komutunu kullanabilirsiniz. ```bash # 'mysite' adında yeni bir Django projesi oluşturun django-admin startproject mysite . # Sondaki nokta (.), projenin mevcut dizine oluşturulmasını sağlar. # Aksi takdirde, mysite adında iç içe bir klasör daha oluşturur. ``` Bu komut, projeniz için gerekli temel dosya ve klasör yapısını oluşturacaktır: ``` my_django_project_2026/ ├── venv/ ├── manage.py └── mysite/ ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py ``` * `manage.py`: Projenizle etkileşim kurmak için kullanılan bir komut satırı aracıdır. Sunucuyu çalıştırma, veritabanı geçişleri yapma gibi işlemlerde kullanılır. * `mysite/`: Projenizin ana Python paketi. İçindeki dosyalar projenizin ayarlarını, URL tanımlarını ve diğer yapılandırmalarını içerir. **Adım 4: Veritabanı Geçişlerini Uygulama** Django, varsayılan olarak `SQLite` veritabanı kullanır. İlk projenizi oluşturduğunuzda, Django'nun kullanıcı yönetimi, kimlik doğrulama gibi dahili özelliklerinin veritabanı tablolarını oluşturmanız gerekir. ```bash # Veritabanı geçişlerini uygulayın python manage.py migrate ``` Bu komut, projenizin kök dizininde `db.sqlite3` adında bir veritabanı dosyası oluşturacak ve gerekli tabloları kuracaktır. **Adım 5: Geliştirme Sunucusunu Çalıştırma** Artık projenizi bir web tarayıcısında görüntülemek için geliştirme sunucusunu çalıştırabilirsiniz. ```bash # Geliştirme sunucusunu çalıştırın python manage.py runserver ``` Bu komutu çalıştırdıktan sonra terminalinizde `Starting development server at http://127.0.0.1:8000/` gibi bir çıktı göreceksiniz. Tarayıcınızda bu adrese giderek Django'nun varsayılan hoş geldiniz sayfasını görebilirsiniz. Bu, ilk Django projenizin başarıyla çalıştığı anlamına gelir! ## Django ile Temel Uygulama Geliştirme (2026 Pratikleri) Django projenizi kurduğunuza göre, şimdi temel bir uygulama (app) oluşturalım ve nasıl çalıştığını görelim. Django projeleri, modüler yapıda `app`'lerden oluşur. Her app, belirli bir işlevselliği (örneğin blog, kullanıcılar, ürünler) temsil eder. **Adım 1: Yeni Bir Uygulama (App) Oluşturma** Projenizin kök dizininde (`manage.py` dosyasının olduğu yerde) yeni bir uygulama oluşturun. ```bash # 'blog' adında yeni bir uygulama oluşturun python manage.py startapp blog ``` Bu komut, `blog` adında yeni bir dizin oluşturacak ve içinde temel dosyaları barındıracaktır: ``` my_django_project_2026/ ├── venv/ ├── manage.py ├── mysite/ └── blog/ ├── __init__.py ├── admin.py ├── apps.py ├── migrations/ ├── models.py ├── tests.py └── views.py ``` **Adım 2: Uygulamayı Projeye Tanıtma** Oluşturduğunuz `blog` uygulamasını Django projenize tanıtmanız gerekir. Bunun için `mysite/settings.py` dosyasını açın ve `INSTALLED_APPS` listesine `blog` uygulamasını ekleyin. ```python # mysite/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', # Yeni eklediğimiz uygulama ] ``` **Adım 3: Model Oluşturma (Veritabanı Yapısı)** `blog` uygulamamız için bir gönderi (Post) modeli oluşturalım. Modeller, veritabanı tablolarınızın Python nesneleri olarak temsilidir. `blog/models.py` dosyasını açın ve aşağıdaki kodu ekleyin. ```python # blog/models.py from django.db import models class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() published_date = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title ``` Bu model, `Post` adında bir veritabanı tablosu oluşturacak ve `title`, `content`, `published_date` gibi alanlara sahip olacaktır. **Adım 4: Veritabanı Geçişleri (Migrations)** Modelinizi oluşturduktan sonra, Django'nun bu modeli veritabanı tablolarına dönüştürmesi için geçiş dosyaları oluşturmanız ve uygulamanız gerekir. ```bash # Model değişikliklerinden migration dosyaları oluşturun python manage.py makemigrations blog # Migration dosyalarını veritabanına uygulayın python manage.py migrate ``` **Adım 5: Yönetici Panelinde Modeli Kaydetme** Oluşturduğumuz `Post` modelini Django'nun dahili yönetici panelinde görünür hale getirelim. Bu sayede, kod yazmadan gönderi ekleyip düzenleyebiliriz. `blog/admin.py` dosyasını açın ve aşağıdaki kodu ekleyin. ```python # blog/admin.py from django.contrib import admin from .models import Post admin.site.register(Post) ``` Şimdi bir `superuser` oluşturalım ve yönetici paneline erişelim: ```bash # Yönetici kullanıcı oluşturun python manage.py createsuperuser # Kullanıcı adı, e-posta ve şifre bilgilerini girin ``` Geliştirme sunucusunu çalıştırın (`python manage.py runserver`) ve tarayıcınızda `http://127.0.0.1:8000/admin/` adresine gidin. Oluşturduğunuz kullanıcı adı ve şifre ile giriş yaparak `Post` modelinizi görebilir ve yeni gönderiler ekleyebilirsiniz. **Adım 6: View ve URL Oluşturma (Web Sayfası)** Şimdi blog gönderilerini listeleyecek bir view ve bu view'e yönlendirecek bir URL oluşturalım. `blog/views.py` dosyasını açın ve aşağıdaki kodu ekleyin: ```python # blog/views.py from django.shortcuts import render from .models import Post def post_list(request): posts = Post.objects.all().order_by('-published_date') return render(request, 'blog/post_list.html', {'posts': posts}) ``` Bu view, tüm `Post` nesnelerini veritabanından çeker ve bunları `blog/post_list.html` adlı bir template'e gönderir. Şimdi bu view için bir URL tanımlayalım. `blog` uygulaması içinde `urls.py` adında yeni bir dosya oluşturun (`blog/urls.py`). ```python # blog/urls.py from django.urls import path from . import views urlpatterns = [ path('', views.post_list, name='post_list'), ] ``` Son olarak, projenin ana `urls.py` dosyasına (`mysite/urls.py`) `blog` uygulamasının URL'lerini dahil edin. ```python # mysite/urls.py from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('blog/', include('blog.urls')), # Blog uygulamasının URL'lerini dahil ettik ] ``` **Adım 7: Template Oluşturma (HTML Sayfası)** `blog` uygulamamızın içinde `templates` adında bir klasör oluşturun, onun içinde de `blog` adında bir klasör daha oluşturun (`blog/templates/blog/`). Bu yapı, template isim çakışmalarını önlemek için bir best practice'tir. `blog/templates/blog/post_list.html` dosyasını oluşturun ve aşağıdaki HTML kodunu ekleyin: ```html Blog Gönderileri - 2026

2026 Blog Gönderileri

{% if posts %} {% for post in posts %}

{{ post.title }}

Yayınlanma Tarihi: {{ post.published_date|date:"d M Y H:i" }}

{{ post.content|truncatechars:200 }}

{% endfor %} {% else %}

Henüz hiç gönderi bulunmamaktadır.

{% endif %}
``` Geliştirme sunucusunu tekrar çalıştırın ve `http://127.0.0.1:8000/blog/` adresine gidin. Yönetici panelinden eklediğiniz gönderileri burada listelenmiş olarak görmelisiniz. Tebrikler, ilk Django uygulamanızı başarıyla oluşturdunuz! ## Django'da İleri Seviye Teknikler ve Tasarım Kalıpları (2026) Temel Django yapısını anladıktan sonra, uygulamalarınızı daha güçlü, ölçeklenebilir ve sürdürülebilir hale getirecek ileri seviye tekniklere ve tasarım kalıplarına göz atalım. 10 yılı aşkın süredir üretim ortamında Django projeleri geliştirirken edindiğim tecrübeler, bu tekniklerin ne kadar kritik olduğunu gösterdi. ### 1. Sınıf Tabanlı View'ler (Class-Based Views - CBV) Fonksiyon tabanlı view'ler (FBV) basit durumlar için yeterli olsa da, tekrar eden kodları azaltmak ve daha yapısal bir yaklaşım benimsemek için `Class-Based Views` (CBV) kullanmak önemlidir. Django, `ListView`, `DetailView`, `CreateView`, `UpdateView`, `DeleteView` gibi genel CBV'ler sunar. Bu view'ler, CRUD işlemlerini çok daha az kodla yapmanızı sağlar. ```python # blog/views.py (CBV örneği) from django.views.generic import ListView, DetailView from .models import Post class PostListView(ListView): model = Post template_name = 'blog/post_list.html' # Varsayılan: blog/post_list.html context_object_name = 'posts' # Varsayılan: object_list ordering = ['-published_date'] paginate_by = 10 # Sayfalama ekleme class PostDetailView(DetailView): model = Post template_name = 'blog/post_detail.html' context_object_name = 'post' ``` URL yapılandırması: ```python # blog/urls.py (CBV ile) from django.urls import path from .views import PostListView, PostDetailView urlpatterns = [ path('', PostListView.as_view(), name='post_list'), path('/', PostDetailView.as_view(), name='post_detail'), ] ``` ### 2. Custom Middleware Geliştirme Middleware'ler, Django'nun request/response döngüsü arasına giren ve her isteği işleyebilen veya değiştirebilen özel fonksiyonlardır. Örneğin, her isteğin süresini ölçmek, kullanıcı oturumlarını kontrol etmek veya özel HTTP başlıkları eklemek için kullanılabilirler. Ekibimizde, API isteklerini loglamak ve belirli IP adreslerinden gelen istekleri sınırlamak için özel middleware'ler geliştirdik. ```python # mysite/middleware.py (Yeni dosya oluşturun) import time class RequestTimingMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): start_time = time.time() response = self.get_response(request) end_time = time.time() request_duration = round((end_time - start_time) * 1000, 2) print(f"Request to {request.path} took {request_duration}ms") return response ``` `mysite/settings.py` dosyasına middleware'i ekleyin: ```python # mysite/settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'mysite.middleware.RequestTimingMiddleware', # Custom middleware'imiz ] ``` ### 3. Sinyaller (Signals) Django sinyalleri, belirli eylemler meydana geldiğinde (örneğin bir model kaydedildiğinde veya silindiğinde) kodunuzun tetiklenmesini sağlar. Bu, gevşek bağlı (loosely coupled) kod yazmak için harika bir yoldur. Örneğin, bir `Post` kaydedildiğinde otomatik olarak bir bildirim gönderebilirsiniz. ```python # blog/signals.py (Yeni dosya oluşturun) from django.db.models.signals import post_save from django.dispatch import receiver from .models import Post @receiver(post_save, sender=Post) def post_created_or_updated(sender, instance, created, **kwargs): if created: print(f"Yeni gönderi oluşturuldu: {instance.title}") # Burada bildirim gönderme veya başka bir işlem yapılabilir else: print(f"Gönderi güncellendi: {instance.title}") ``` Sinyallerin yüklenmesi için `blog/apps.py` dosyasını düzenleyin: ```python # blog/apps.py from django.apps import AppConfig class BlogConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'blog' def ready(self): import blog.signals # Sinyallerimizi yükle ``` ### 4. Asenkron View'ler (ASGI) Django 5.x ve üzeri, asenkron view'ler için tam destek sunar. Bu, özellikle I/O yoğun işlemler (API çağrıları, veritabanı sorguları) sırasında uygulamanızın daha performanslı çalışmasını sağlar. `ASGI` (Asynchronous Server Gateway Interface) sayesinde Django, `async/await` syntax'ını kullanarak non-blocking işlemler gerçekleştirebilir. ```python # blog/views.py (Asenkron view örneği) import asyncio from django.http import JsonResponse async def async_hello(request): # Uzun süren bir I/O işlemi simülasyonu await asyncio.sleep(2) return JsonResponse({'message': 'Hello from async Django! (2026)'}) ``` URL yapılandırması: ```python # blog/urls.py (Asenkron view ile) from django.urls import path from .views import async_hello urlpatterns = [ # ... diğer URL'ler ... path('async-hello/', async_hello, name='async_hello'), ] ``` Bu tarz asenkron view'leri kullanabilmek için projenizi `ASGI` uyumlu bir sunucu (örneğin Uvicorn veya Daphne) ile çalıştırmanız gerekir. > **Uyarı:** Asenkron view'ler, Django ORM'in çoğu işlemi varsayılan olarak senkron olduğu için dikkatli kullanılmalıdır. ORM sorguları `sync_to_async` ile sarılmalı veya asenkron ORM kütüphaneleri (varsa) kullanılmalıdır. ### 5. Caching Stratejileri Performans optimizasyonu için caching kritik öneme sahiptir. Django, farklı caching back-end'leri (memcached, Redis, veritabanı, dosya sistemi) ve çeşitli caching stratejileri sunar: * **Per-site cache:** Tüm siteyi önbelleğe alır. * **Per-view cache:** Belirli view'leri önbelleğe alır. * **Template fragment caching:** Template'lerin belirli bölümlerini önbelleğe alır. * **Low-level cache API:** Kendi özel caching mantığınızı yazmanız için esneklik sağlar. `mysite/settings.py` içinde `Redis` tabanlı bir cache yapılandırması: ```python # mysite/settings.py CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', }, 'redis': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/1', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } } } # Bir view'i önbelleğe alma (örnek) from django.views.decorators.cache import cache_page @cache_page(60 * 15) # 15 dakika önbellekte tut def my_cached_view(request): # ... view logic ... pass ``` ## Django En İyi Uygulamaları ve Kaçınılması Gereken Hatalar (2026) Django projelerinizi 2026 standartlarında geliştirirken performansı, güvenliği ve sürdürülebilirliği artırmak için izlemeniz gereken bazı en iyi uygulamalar ve kaçınmanız gereken anti-pattern'ler bulunmaktadır. Ekibimizde `Python DevOps` süreçlerini uygularken bu prensiplere sıkı sıkıya bağlı kalıyoruz. ### ✅ Doğru Uygulamalar (Best Practices) 1. **Sanal Ortam Kullanın:** Her proje için izole bir sanal ortam (`venv` veya `conda`) kullanmak, bağımlılık çakışmalarını önler ve proje taşınabilirliğini artırır. Bu, 2026'da hala temel bir gerekliliktir. 2. **`settings.py` Dosyasını Ortama Göre Ayarlayın:** Geliştirme, test ve üretim ortamları için farklı ayar dosyaları veya ortam değişkenleri (`os.environ`) kullanın. Hassas bilgileri (`SECRET_KEY`, veritabanı şifreleri) doğrudan `settings.py` içinde saklamayın, `.env` dosyaları veya bulut sağlayıcınızın sır yönetimi servislerini kullanın. ```python # mysite/settings.py (Örnek ortam değişkeni kullanımı) import os SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'default-insecure-key-for-dev-2026') DEBUG = os.environ.get('DJANGO_DEBUG', 'False').lower() == 'true' ``` 3. **App'leri Modüler Tutun:** Her Django uygulaması (app), tek bir sorumluluğa sahip olmalı ve kendi içinde bağımsız çalışabilmelidir. Bu, kodun yeniden kullanılabilirliğini ve bakımını kolaylaştırır. 4. **`requirements.txt` Dosyasını Güncel Tutun:** Projenizin tüm bağımlılıklarını `requirements.txt` dosyasına kaydedin ve düzenli olarak güncelleyin. `pip freeze > requirements.txt` komutunu kullanın. 5. **Güçlü Şifreleme ve Kimlik Doğrulama Kullanın:** Django'nun yerleşik kimlik doğrulama sistemini kullanın. Şifreler için güçlü hash algoritmaları (PBKDF2) ve çok faktörlü kimlik doğrulama (MFA) seçeneklerini değerlendirin. 6. **Veritabanı Sorgularını Optimize Edin:** N+1 sorunlarından kaçınmak için `select_related()` ve `prefetch_related()` kullanın. Gereksiz sorguları önlemek için `only()` ve `defer()` metodlarını değerlendirin. 7. **Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD):** Projenizi otomatik testler, kod analizi ve dağıtım süreçleriyle destekleyin. `GitHub Actions`, `GitLab CI` veya `Jenkins` gibi araçları kullanın. Bu, 2026'da modern `DevOps` pratiklerinin temelidir. 8. **Logging Kullanın:** Uygulamanızın davranışını izlemek ve hataları ayıklamak için kapsamlı bir loglama sistemi kurun. `settings.py` içinde `LOGGING` yapılandırmasını doğru bir şekilde yapın. 9. **Güvenlik Başlıklarını Yapılandırın:** `X-Frame-Options`, `X-Content-Type-Options`, `Strict-Transport-Security` gibi HTTP güvenlik başlıklarını `settings.py` veya `middleware` aracılığıyla doğru şekilde ayarlayın. `SecurityMiddleware` çoğu şeyi halleder. 10. **Test Yazın:** Birim testleri, entegrasyon testleri ve uçtan uca testler yazarak kodunuzun kalitesini ve güvenilirliğini artırın. Django'nun test framework'ü oldukça güçlüdür. ### ❌ Kaçınılması Gereken Hatalar (Anti-Patterns) 1. **`DEBUG = True` Üretim Ortamında Bırakmak:** `DEBUG = True` ayarı, hassas bilgileri açığa çıkarabilir ve güvenlik riski oluşturur. Üretim ortamında daima `DEBUG = False` olarak ayarlanmalıdır. 2. **`SECRET_KEY`'i Açıkta Bırakmak:** `SECRET_KEY`, oturum yönetimi ve diğer güvenlik özelliklerinde kullanılır. Bu anahtar asla açık metin olarak veya sürüm kontrol sistemine (`Git`) dahil edilmemelidir. 3. **N+1 Sorgu Problemleri:** Her bir ilişkili nesne için ayrı bir veritabanı sorgusu yapmak, performansı ciddi şekilde düşürür. `select_related()` ve `prefetch_related()` kullanmamak yaygın bir hatadır. 4. **Tüm Verileri Çekmek:** Sadece ihtiyacınız olan alanları çekmek yerine `Post.objects.all()` gibi tüm alanları çekmek, veritabanı ve ağ yükünü artırır. `values()` veya `only()` kullanın. 5. **Template'lerde İş Mantığı:** Template'ler sadece sunum katmanı olmalıdır. Karmaşık iş mantığını view'lere veya custom template tag'lerine taşıyın. 6. **Senkron Bloklayan İşlemler:** Uzun süren API çağrıları, dosya işlemleri gibi I/O yoğun görevleri senkron bir şekilde çalıştırmak, uygulamanızın yanıt verme süresini uzatır. `Celery` gibi asenkron görev kuyrukları kullanın veya `async` view'lere geçiş yapın. 7. **`settings.py` Dosyasını Aşırı Şişirmek:** Tek bir `settings.py` dosyası yerine, farklı ortamlar için ayrı ayar dosyaları (`settings/base.py`, `settings/dev.py`, `settings/prod.py`) kullanmak daha yönetilebilirdir. ## Django'da Sık Karşılaşılan Hatalar ve Çözümleri (2026) Django geliştirme sürecinde, özellikle yeni başlayanlar için bazı yaygın hatalarla karşılaşmak kaçınılmazdır. İşte Stack Overflow ve geliştirici forumlarında en sık sorulan 3-4 hata ve bunların 2026'daki çözümleri. ### 1. `ModuleNotFoundError: No module named 'django'` * **Problem:** Django'yu kurduktan sonra `python manage.py runserver` gibi bir komut çalıştırdığınızda bu hatayı alırsınız. * **Sebep:** Genellikle sanal ortamın etkinleştirilmemiş olması veya Django'nun doğru Python yorumlayıcısına kurulmamış olmasıdır. Sisteminizde birden fazla Python sürümü olabilir. * **Çözüm:** Projenizin sanal ortamını doğru şekilde etkinleştirdiğinizden emin olun. Eğer etkin değilse, `source venv/bin/activate` (Linux/macOS) veya `.\venv\Scripts\Activate.ps1` (Windows PowerShell) komutunu çalıştırın. Ardından `pip install Django` komutunu tekrar çalıştırarak Django'nun etkin sanal ortama kurulduğundan emin olun. ### 2. `ImproperlyConfigured: The SECRET_KEY setting must not be empty.` * **Problem:** Projenizi çalıştırmaya çalışırken `SECRET_KEY` ile ilgili bir hata alırsınız. * **Sebep:** `mysite/settings.py` dosyasındaki `SECRET_KEY` değeri boş bırakılmış veya üretim ortamında `.env` dosyası gibi bir yerden doğru şekilde yüklenememiştir. * **Çözüm:** Geliştirme ortamı için `SECRET_KEY`'e geçici bir değer atayabilir veya üretim için bir `.env` dosyası kullanarak bu değeri güvenli bir şekilde tanımlayabilirsiniz. Örneğin, `settings.py` dosyanızda `SECRET_KEY = 'your-super-secret-key-2026'` gibi bir satır ekleyebilir veya `python -c 'import os; print(os.urandom(40))'` ile rastgele bir anahtar oluşturabilirsiniz. Ancak, üretim ortamında bu anahtarın ortam değişkenlerinden (`os.environ.get`) gelmesi en sağlıklısıdır. ### 3. `OperationalError: no such table: appname_modelname` * **Problem:** Veritabanı sorgusu yapmaya çalışırken, Django'nun belirli bir tabloyu bulamadığını belirten bir hata alırsınız. * **Sebep:** Modelinizi oluşturduktan veya değiştirdikten sonra `makemigrations` v