Django App Nedir? Proje ve Uygulama Arasındaki Farklar

Django öğrenme sürecinde en kritik dönemeçlerden biri, "Proje" (Project) ve "Uygulama" (App) arasındaki farkı kavramaktır. Bu makaleyi, teknik terimleri yeni öğrenenler için anlaşılır kılacak şekilde, modüler bir yapıda hazırladım.



Web geliştirme dünyasında Python'un en güçlü framework'ü olan Django, "Don't Repeat Yourself" (Kendini Tekrar Etme) ve "Pluggability" (Tak-Çıkar Yapısı) felsefeleri üzerine kuruludur. Bu felsefenin kalbinde ise Django App kavramı yatar.


1. Kavram Kargaşasını Çözmek: Project vs. App

Django'ya yeni başlayanların en sık karıştırdığı iki kavram "Project" ve "App"tir. Bunu bir Üniversite Kampüsü analojisi ile açıklayalım:

  • Django Project (Kampüs): Proje, web sitenizin tamamıdır. Ayarların (settings.py), veritabanı konfigürasyonlarının ve genel URL yönlendirmelerinin bulunduğu çatıdır. Kampüsün tamamını temsil eder.

  • Django App (Fakülte): App, proje içinde belirli bir işlevi yerine getiren bağımsız modüldür. Örneğin; Mühendislik Fakültesi, Tıp Fakültesi gibi. Her biri kendi işini yapar ama hepsi kampüse (Projeye) bağlıdır.

Örnek: Bir e-ticaret sitesi (Project) düşünün. İçindeki modüller (Apps) şunlar olabilir:

  • users: Üye giriş/çıkış işlemleri.

  • products: Ürünlerin listelenmesi ve detayları.

  • cart: Sepet işlemleri.

  • payment: Ödeme sistemleri.

Altın Kural: Bir Django projesi birden fazla "App" içerebilir. Aynı zamanda iyi yazılmış bir "App", birden fazla Django projesinde tekrar kullanılabilir.


2. Bir Django App Nasıl Oluşturulur?

Terminal veya komut satırında, projenizin bulunduğu dizinde şu komutu çalıştırarak yeni bir uygulama oluşturursunuz:

Bash:
python manage.py startapp uygulama_adi

Bu komut, Django'nun sizin için standart bir klasör yapısı oluşturmasını sağlar. Ancak iş burada bitmez; Django'ya "Ben yeni bir uygulama ekledim, bundan haberin olsun" demeniz gerekir.

Bunun için settings.py dosyasındaki INSTALLED_APPS listesine uygulamanızı eklemelisiniz:

Python:
# settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    # ... diğer varsayılan uygulamalar
    'uygulama_adi',  # Yeni eklediğimiz app
]

3. Django App Anatomisi: Dosya Yapısı

startapp komutunu çalıştırdığınızda oluşan dosya yapısı, Django'nun MVT (Model-View-Template) mimarisini yansıtır. İşte dosyalar ve görevleri:

A. models.py (Veri Tabanı Tasarımı)

Uygulamanızın veri yapısını burada tanımlarsınız. Django, buradaki sınıfları (Class) otomatik olarak veritabanı tablolarına dönüştürür (ORM).

Python:
from django.db import models

class Makale(models.Model):
    baslik = models.CharField(max_length=200)
    icerik = models.TextField()
    yayin_tarihi = models.DateTimeField(auto_now_add=True)

B. views.py (İş Mantığı - Beyin)

Kullanıcıdan gelen isteği (request) alan, veritabanından gerekli bilgiyi çeken ve kullanıcıya bir yanıt (response) dönen kısımdır.

Python:
from django.http import HttpResponse

def ana_sayfa(request):
    return HttpResponse("Merhaba, burası ana sayfa!")

C. urls.py (Yönlendirme - Resepsiyon)

Genellikle uygulamayı oluşturduğunuzda boş gelmez, sizin oluşturmanız gerekebilir. Hangi URL adresinin hangi view fonksiyonunu çalıştıracağını belirler.

Python:
from django.urls import path
from . import views

urlpatterns = [
    path('', views.ana_sayfa, name='ana_sayfa'),
]

D. admin.py (Yönetim Paneli)

Oluşturduğunuz modellerin Django'nun hazır yönetim panelinde nasıl görüneceğini ayarlar.

E. apps.py (Uygulama Ayarları)

Uygulamanın meta verilerini (örneğin uygulamanın görünen adı) barındırır. Genellikle buraya müdahale etmeniz gerekmez.

F. migrations/ Klasörü

Veritabanında yaptığınız değişikliklerin (tablo oluşturma, sütun ekleme vb.) tarihçesini tutan dosyalardır. python manage.py makemigrations komutu ile buraya dosyalar eklenir.


4. Neden Modüler (App) Yapı Kullanmalıyız?

  1. Organizasyon: 10.000 satırlık tek bir dosya yerine, işlevlerine göre ayrılmış küçük dosyalarla çalışmak bakımı kolaylaştırır.

  2. Takım Çalışması: Bir yazılımcı blog app'i üzerinde çalışırken, diğeri forum app'i üzerinde çalışabilir. Çakışmalar azalır.

  3. Yeniden Kullanılabilirlik (Reusability): Yazdığınız bir "Anket Uygulaması"nı paketleyip, hiç kod değiştirmeden başka bir müşterinizin projesine dahil edebilirsiniz.


Sonuç

Django App, modern web geliştirmede karmaşıklığı yönetmenin en etkili yoludur. Her bir "App"i, tek bir sorunu çözen küçük bir programcık olarak düşünmek, büyük projelerin altında ezilmenizi engeller.


🧩 Django App Nedir?

Django App, Django projesi içinde belirli bir işi yapan, bağımsız ve yeniden kullanılabilir modüldür.

👉 Django felsefesi:
“Bir proje, birden fazla app’ten oluşur.”

Örnek:

  • Blog sistemi → blog app

  • Kullanıcı işlemleri → accounts app

  • Yorum sistemi → comments app


📁 Django Proje – App İlişkisi

myproject/        ← Django Project
│
├── manage.py
├── myproject/
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
│
├── blog/          ← Django App
│   ├── models.py
│   ├── views.py
│   ├── urls.py
│   └── templates/

📌 Project: Ayarları ve uygulamaları yöneten çatı
📌 App: Tek bir iş yapan modül


⚙️ Django App Oluşturma

1️⃣ App Oluşturma

python manage.py startapp blog

Oluşan yapı:

blog/
├── admin.py
├── apps.py
├── models.py
├── tests.py
├── views.py
└── migrations/

2️⃣ App’i Projeye Tanıtma

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    ...
    'blog',
]

📌 Bu adım zorunludur, yoksa Django app’i görmez.


Django App Dosyalarının Görevleri

📄 apps.py

from django.apps import AppConfig

class BlogConfig(AppConfig):
    name = 'blog'

✔ App konfigürasyonu
✔ Büyük projelerde sinyal ve ayar yönetimi için kullanılır


📄 models.py – Veritabanı Katmanı

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

📌 Django ORM sayesinde SQL yazmadan tablo oluşturulur


Migration İşlemleri

python manage.py makemigrations
python manage.py migrate

📄 admin.py – Yönetim Paneli

from django.contrib import admin
from .models import Post

admin.site.register(Post)

📌 /admin panelinden veri ekleyip silebilirsin


📄 views.py – İş Mantığı

from django.http import HttpResponse

def home(request):
    return HttpResponse("Blog App Ana Sayfa")

✔ Request alır
✔ Response döndürür
✔ MVC değil → MTV mimarisi


📄 urls.py – App URL Yapısı

📌 App içine urls.py eklenir:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
]

Proje urls.py bağlantısı

from django.urls import path, include

urlpatterns = [
    path('blog/', include('blog.urls')),
]

🧩 Template (HTML) Kullanımı

📁 blog/templates/blog/index.html

<h1>{{ title }}</h1>
<p>Merhaba Django App</p>

View güncelleme

from django.shortcuts import render

def home(request):
    return render(request, 'blog/index.html', {
        'title': 'Blog Ana Sayfa'
    })

📌 Templates app’e özel klasör yapısında tutulmalı


Django App’lerde MTV Mimarisi

Django    Görev
Model        Veritabanı
Template        Arayüz
View        İş mantığı

🔐 App Bazlı Auth Yapısı

Örnek: accounts app

python manage.py startapp accounts
  • login

  • register

  • logout

  • profile

📌 Büyük projelerde her iş ayrı app olmalı


🧪 App Tabanlı Test Mantığı

tests.py

from django.test import TestCase

class BlogTest(TestCase):
    def test_home_page(self):
        response = self.client.get('/blog/')
        self.assertEqual(response.status_code, 200)

İyi Django App Tasarım Prensipleri

✅ Tek sorumluluk
✅ Yeniden kullanılabilir
✅ Bağımsız URL yapısı
✅ App içi template klasörü
✅ App içi urls.py

🚫 Her şeyi tek app’e koyma
🚫 İş mantığını template’e yazma


📚 Gerçek Hayat App Örnekleri

AppGörev
blog        Yazı yönetimi
accounts        Kullanıcı işlemleri
dashboard        Yönetim ekranı
api        REST servisleri
comments        Yorum sistemi

🧪 Mini Lab Senaryosu

🎯 Görev:
Bir notes app oluştur

✔ Not başlığı
✔ İçerik
✔ Tarih
✔ Admin panelden ekleme
/notes/ URL’i


Sonuç

Django App =
Modüler, temiz, sürdürülebilir proje yapısı

Bir Django geliştiricisini güçlü yapan şey:
✔ Doğru app tasarımı
✔ App’leri parçalara ayırabilme becerisi


Harika 👍
Aşağıda Pardus ETAP 23 ortamına birebir uyumlu, sınıf içinde uygulanabilir, adım adım ilerleyen Django App Lab Senaryosu hazırladım.
Bu senaryo öğretmen rehberi + öğrenci uygulaması mantığıyla yazıldı.


🧪 Django App Lab Senaryosu

🎯 Konu: Django App Yapısı ve Kullanımı


🧑‍🏫 Ders Bilgileri

BaşlıkBilgi
DersWeb Programlama / Python
Sınıf10–11. Sınıf
OrtamPardus ETAP 23
Süre2 ders saati
AraçlarPython 3, Django, Terminal, VS Code

🎯 Kazanımlar

Öğrenci bu lab sonunda:

✅ Django projesi oluşturur
✅ Django App kavramını öğrenir
✅ App–Project ilişkisini kavrar
✅ View, URL ve Template yapısını uygular
✅ Modüler yazılım mantığını öğrenir


🧩 Senaryo Konusu

📒 “Ders Notları” Uygulaması (notes app)

Öğrenciler, ders notlarını listeleyen basit bir Django App geliştirecek.


🧪 LAB – AŞAMA AŞAMA


🔹 AŞAMA 1: Ortam Kontrolü (Öğretmen Rehberi)

ETAP 23’te terminal açılır:

python3 --version

Django yüklü mü kontrol edilir:

django-admin --version

📌 Yüklü değilse:

pip install django

🔹 AŞAMA 2: Django Projesi Oluşturma

django-admin startproject okul
cd okul

Çalıştırma testi:

python manage.py runserver

📌 Tarayıcı:
http://127.0.0.1:8000


🔹 AŞAMA 3: Django App Oluşturma

python manage.py startapp notes

Oluşan yapı:

notes/
├── admin.py
├── apps.py
├── models.py
├── views.py
└── migrations/

🔹 AŞAMA 4: App’i Tanıtma (settings.py)

INSTALLED_APPS = [
    ...
    'notes',
]

📌 En sık yapılan hata:
App eklemeyi unutmak ❌


🔹 AŞAMA 5: İlk View Yazımı

notes/views.py

from django.http import HttpResponse

def index(request):
    return HttpResponse("📘 Ders Notları Uygulamasına Hoş Geldin")

🔹 AŞAMA 6: App URL Yapısı

📁 notes/urls.py (öğrenci oluşturur)

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index),
]

🔹 AŞAMA 7: Proje URL Bağlantısı

okul/urls.py

from django.urls import path, include

urlpatterns = [
    path('notes/', include('notes.urls')),
]

📌 Test:
http://127.0.0.1:8000/notes/


🔹 AŞAMA 8: Template Kullanımı

📁 Klasör yapısı:

notes/
└── templates/
    └── notes/
        └── index.html

index.html

<h1>{{ baslik }}</h1>
<ul>
  <li>Python</li>
  <li>Django</li>
  <li>Linux</li>
</ul>

View Güncelleme

from django.shortcuts import render

def index(request):
    return render(request, 'notes/index.html', {
        'baslik': '📒 Ders Notları'
    })

🔹 AŞAMA 9: Basit Model (Opsiyonel)

notes/models.py

from django.db import models

class Note(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

    def __str__(self):
        return self.title

Migration:

python manage.py makemigrations
python manage.py migrate

🔹 AŞAMA 10: Admin Panel

notes/admin.py

from django.contrib import admin
from .models import Note

admin.site.register(Note)

Admin kullanıcı:

python manage.py createsuperuser

📌 /admin panelinden not ekleme


Özel Öğretim İpuçları

🎯 Akıllı Tahta için:

  • Koyu tema (VS Code)

  • Büyük font

  • Kod–çıktı eş zamanlı gösterim

🎯 Öğrenci için:

  • Her aşamadan sonra çalıştırma

  • Hata mesajlarını birlikte okuma


🧪 Ölçme – Değerlendirme

📝 Kısa Sorular

1️⃣ Django App nedir?
2️⃣ INSTALLED_APPS ne işe yarar?
3️⃣ Neden her app’in urls.py dosyası olmalı?


🛠 Mini Görev

📌 teachers adında yeni bir app oluştur
📌 /teachers/ URL’inde “Öğretmenler” yazsın


🏁 Sonuç

✔ ETAP 23 uyumlu
✔ Modüler Django mantığı
✔ Sınıf içi birebir uygulanabilir
✔ Temelden sağlam altyapı


Aşağıda sınıf ortamında adım adım uygulanabilir bir Django Login–Register App Lab Senaryosu bulacaksın.

Bu senaryo özellikle auth mantığını öğretmek, ama öğrenciyi boğmamak için Django’nun hazır sistemini bilinçli kullanır.


🔐 Uyumlu Django Login–Register App Lab Senaryosu

🎯 Konu: Django Authentication (Login – Register – Logout)


🧑‍🏫 Ders Bilgileri

BaşlıkBilgi
DersWeb Programlama / Python
Sınıf11. Sınıf
OrtamPardus ETAP 23
Süre2–3 ders saati
TeknolojiDjango Auth, Templates

🎯 Kazanımlar

Öğrenci bu lab sonunda:

✅ Django auth sistemini tanır
✅ Login – Logout işlemlerini uygular
✅ Register (kayıt) ekranı oluşturur
✅ Yetkili / yetkisiz kullanıcı farkını öğrenir
✅ App tabanlı kimlik doğrulama mantığını kavrar


🧩 Senaryo Konusu

👤 “Okul Portalı” – Kullanıcı Giriş Sistemi

Öğrenciler, kayıt olabilen ve giriş yapabilen bir kullanıcı sistemi geliştirir.


🧪 LAB AŞAMALARI


🔹 AŞAMA 1: Proje ve App Hazırlığı

django-admin startproject okul
cd okul
python manage.py startapp accounts

settings.py

INSTALLED_APPS = [
    ...
    'django.contrib.auth',
    'django.contrib.sessions',
    'accounts',
]

🔹 AŞAMA 2: Template ve Static Ayarları (ETAP Dostu)

settings.py

TEMPLATES[0]['DIRS'] = [BASE_DIR / 'templates']

📁 Klasör:

templates/
└── accounts/

🔹 AŞAMA 3: Login View (Hazır Auth Kullanımı)

accounts/views.py

from django.contrib.auth.views import LoginView

class UserLoginView(LoginView):
    template_name = 'accounts/login.html'

accounts/urls.py

from django.urls import path
from .views import UserLoginView
from django.contrib.auth.views import LogoutView

urlpatterns = [
    path('login/', UserLoginView.as_view(), name='login'),
    path('logout/', LogoutView.as_view(), name='logout'),
]

Proje URL

okul/urls.py

from django.urls import path, include

urlpatterns = [
    path('accounts/', include('accounts.urls')),
]

🔹 AŞAMA 4: Login Template

📄 templates/accounts/login.html

<h2>🔐 Giriş Yap</h2>

<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Giriş</button>
</form>

📌 Test:
/accounts/login


🔹 AŞAMA 5: Register (Kayıt) Sistemi

accounts/views.py

from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('login')
    else:
        form = UserCreationForm()

    return render(request, 'accounts/register.html', {'form': form})

URL’e ekle

path('register/', views.register, name='register'),

Register Template

<h2>📝 Kayıt Ol</h2>

<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button>Kayıt Ol</button>
</form>

📌 Test:
/accounts/register


🔹 AŞAMA 6: Login Zorunlu Sayfa

accounts/views.py

from django.contrib.auth.decorators import login_required

@login_required
def profile(request):
    return render(request, 'accounts/profile.html')

URL

path('profile/', views.profile, name='profile'),

Template

<h2>👋 Hoş geldin {{ user.username }}</h2>
<a href="{% url 'logout' %}">Çıkış Yap</a>

🔹 AŞAMA 7: Login Redirect Ayarı

settings.py

LOGIN_URL = '/accounts/login/'
LOGIN_REDIRECT_URL = '/accounts/profile/'
LOGOUT_REDIRECT_URL = '/accounts/login/'

Pedagojik İpuçları

🎯 Tahtada vurgula:

  • Şifre hash’lenir

  • Formları biz yazmadık → Django verdi

  • Güvenlik Django’ya emanet

🎯 Öğrenciye sor:

“Bu sistemi biz yazsaydık ne olurdu?”


🧪 Ölçme – Değerlendirme

📝 Sorular

1️⃣ Django neden hazır auth sistemi sunar?
2️⃣ login_required ne işe yarar?
3️⃣ CSRF neden zorunludur?


🛠 Mini Görev

📌 Profile sayfasına:

  • Kullanıcının e-postası

  • Giriş durumu mesajı ekle


🚨 Bilerek Yapılan Hatalar (Tartışma)

❌ Login olmadan profile erişmeye çalış
❌ URL’yi elle yaz
❌ CSRF’yi kaldır

👉 Sonuçları sınıfta tartış


🏁 Sonuç

✔ Gerçek hayata uygun
✔ Güvenli
✔ Django standartlarını öğretir.


Aşağıda, bir Blog Uygulaması ("blog_app") için models.py (Veri) ve views.py (Mantık) dosyalarının birbiriyle nasıl konuştuğunu gösteren, eğitim materyali olarak kullanabileceğiniz sadeleştirilmiş bir kod örneği hazırladım.

Bu örnekte akış şöyledir: Model veriyi tanımlar -> View veriyi çeker -> Template veriyi gösterir.


1. Adım: Veri Tabanı Tasarımı (models.py)

İlk olarak, bir blog yazısının nelerden oluşacağını tanımlarız.

Python:
# blog_app/models.py

from django.db import models

class Makale(models.Model):
    # Yazının başlığı (Maksimum 200 karakter)
    baslik = models.CharField(max_length=200)
    
    # Yazının uzun metni
    icerik = models.TextField()
    
    # Oluşturulma tarihi (Otomatik eklenir)
    yayin_tarihi = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.baslik

 CharField ve TextField arasındaki farkı (kısa metin vs. uzun metin) 


2. Adım: Veriyi Çekme ve İşleme (views.py)

Burası en kritik noktadır. View dosyası, Model dosyasını import ederek onunla konuşur.

Python:
# blog_app/views.py

from django.shortcuts import render
# DİKKAT: Modelimizi buradan çağırıyoruz
from .models import Makale 

def makale_listesi(request):
    # 1. Adım: Veritabanındaki tüm makaleleri çekiyoruz (Sorgu)
    tum_yazilar = Makale.objects.all().order_by('-yayin_tarihi')
    
    # 2. Adım: Bu veriyi bir paket (context) içine koyuyoruz
    context = {
        'yazilar': tum_yazilar
    }
    
    # 3. Adım: Paketi HTML şablonuna gönderiyoruz
    return render(request, 'blog_app/liste.html', context)

3. Adım: Veriyi Ekrana Basma (liste.html)

Son olarak, views.py'dan gelen paketi (context) açıp kullanıcıya gösteririz.

HTML:
<!DOCTYPE html>
<html>
<head>
    <title>Blog Sayfam</title>
</head>
<body>
    <h1>Yayınlanan Makaleler</h1>

    {% for yazi in yazilar %}
        <div class="kutu">
            <h2>{{ yazi.baslik }}</h2>
            <small>{{ yazi.yayin_tarihi }} tarihinde yayınlandı.</small>
            <p>{{ yazi.icerik }}</p>
        </div>
        <hr>
    {% endfor %}
</body>
</html>

Özet: İlişki Nasıl Kuruldu?

Bu kod örneğini makalenize eklerken şu özet akışı kullanabilirsiniz:

  1. models.py: "Benim adım Makale, bende başlık ve içerik var." der.

  2. views.py: Makale modelini çağırır, "Bana tüm kayıtlarını ver" der (objects.all()) ve bunları bir context değişkenine paketler.

  3. Template: Paketten çıkan veriyi for döngüsü ile tek tek ekrana yazar.



Yorumlar

Bu blogdaki popüler yayınlar

Pardus Üzerine Django Kurulumu

Python ile Web Geliştirme: Django App Oluşturma