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:
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:
# 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).
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.
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.
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?
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.
Takım Çalışması: Bir yazılımcı
blogapp'i üzerinde çalışırken, diğeriforumapp'i üzerinde çalışabilir. Çakışmalar azalır.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 →
blogappKullanıcı işlemleri →
accountsappYorum sistemi →
commentsapp
📁 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
| App | Gö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ık | Bilgi |
|---|---|
| Ders | Web Programlama / Python |
| Sınıf | 10–11. Sınıf |
| Ortam | Pardus ETAP 23 |
| Süre | 2 ders saati |
| Araçlar | Python 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ı
🔐 Uyumlu Django Login–Register App Lab Senaryosu
🎯 Konu: Django Authentication (Login – Register – Logout)
🧑🏫 Ders Bilgileri
| Başlık | Bilgi |
|---|---|
| Ders | Web Programlama / Python |
| Sınıf | 11. Sınıf |
| Ortam | Pardus ETAP 23 |
| Süre | 2–3 ders saati |
| Teknoloji | Django 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.
# 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
CharFieldveTextFieldarası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.
# 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.
<!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:
models.py: "Benim adımMakale, bende başlık ve içerik var." der.views.py:Makalemodelini çağırır, "Bana tüm kayıtlarını ver" der (objects.all()) ve bunları bircontextdeğişkenine paketler.Template: Paketten çıkan veriyi
fordöngüsü ile tek tek ekrana yazar.
Yorumlar
Yorum Gönder