Python ile Web Geliştirme: Django vs Flask
Python web geliştirme dünyasında iki büyük framework öne çıkıyor: Django ve Flask. Her ikisi de güçlü ve popüler seçenekler olmakla birlikte, farklı ihtiyaçlar ve proje türleri için optimize edilmişler.
Django: "Batteries Included" Yaklaşımı
Django, tam donanımlı bir web framework'üdür. "Batteries included" (piller dahil) felsefesiyle her şey hazır gelir.
Django'nun Avantajları
# Django Model Örneği
from django.db import models
from django.contrib.auth.models import User
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-created_at']
def __str__(self):
return self.title
Güçlü Yönleri:
- ORM (Object-Relational Mapping): Veritabanı işlemleri için güçlü araçlar
- Admin Panel: Hazır yönetim arayüzü
- Authentication System: Kullanıcı yönetimi sistemi
- Security: CSRF, XSS koruması varsayılan olarak aktif
- Migrations: Veritabanı şema değişikliklerini otomatik yönetim
Django'nun Dezavantajları
- Öğrenme Eğrisi: Daha karmaşık yapı
- Overhead: Küçük projeler için fazla ağır olabilir
- Sıkı Yapı: Django'nun kurallarına uymak zorunlu
- Performans: Basit uygulamalar için gereksiz yük
Flask: Minimalist ve Esnek
Flask, mikro framework olarak tanımlanır. Temel işlevsellik sağlar, geri kalanını geliştiriciye bırakır.
Flask'ın Avantajları
# Flask Uygulaması Örneği
from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
db = SQLAlchemy(app)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
@app.route('/')
def home():
posts = Post.query.all()
return render_template('home.html', posts=posts)
@app.route('/post/<int:id>')
def post(id):
post = Post.query.get_or_404(id)
return render_template('post.html', post=post)
if __name__ == '__main__':
app.run(debug=True)
Güçlü Yönleri:
- Basitlik: Hızlı öğrenme ve geliştirme
- Esneklik: İstediğiniz gibi yapılandırabilirsiniz
- Hafiflik: Minimal overhead
- Modülerlik: Sadece ihtiyacınız olan özellikleri ekleyin
Flask'ın Dezavantajları
- Manuel Konfigürasyon: Her şeyi kendiniz ayarlamalısınız
- Güvenlik: Güvenlik önlemlerini kendiniz implementasyonu
- Büyük Projeler: Kompleks uygulamalar için ek planlama gerekli
- Karar Verme: Çok fazla seçenek karmaşıklığa yol açabilir
Proje Türüne Göre Seçim Kriterleri
Django'yu Seçin Eğer:
# Django - E-ticaret sitesi örneği
# models.py
class Product(models.Model):
name = models.CharField(max_length=200)
price = models.DecimalField(max_digits=10, decimal_places=2)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
class Order(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
products = models.ManyToManyField(Product, through='OrderItem')
created_at = models.DateTimeField(auto_now_add=True)
# views.py
from django.contrib.auth.decorators import login_required
@login_required
def checkout(request):
# Karmaşık iş mantığı
pass
✅ Büyük ve kompleks projeler geliştiriyorsanız ✅ Hızlı prototipleme istiyorsanız ✅ Admin panel ihtiyacınız varsa ✅ Güvenlik kritik öneme sahipse ✅ Ekip halinde çalışıyorsanız
Flask'ı Seçin Eğer:
# Flask - API servis örneği
from flask import Flask, jsonify, request
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
class UserAPI(Resource):
def get(self, user_id):
# Basit API mantığı
return {'user_id': user_id, 'name': 'John Doe'}
def post(self):
data = request.get_json()
# Yeni kullanıcı oluştur
return {'message': 'User created'}, 201
api.add_resource(UserAPI, '/api/users', '/api/users/<int:user_id>')
✅ Küçük ve orta ölçekli projeler için ✅ API servisleri geliştiriyorsanız ✅ Mikroservis mimarisi kullanıyorsanız ✅ Tam kontrol istiyorsanız ✅ Öğrenme amaçlı projeler için
Karşılaştırmalı Örnekler
Veritabanı İşlemleri
Django ORM:
# Kullanıcıların son 10 gönderisini getir
posts = Post.objects.filter(
author__is_active=True
).select_related('author').order_by('-created_at')[:10]
# Aggregate fonksiyonları
from django.db.models import Count, Avg
stats = Post.objects.aggregate(
total_posts=Count('id'),
avg_comments=Avg('comment_count')
)
Flask-SQLAlchemy:
# Aynı işlemi Flask ile
posts = db.session.query(Post).join(User).filter(
User.is_active == True
).order_by(Post.created_at.desc()).limit(10).all()
# Aggregate işlemleri
from sqlalchemy import func
stats = db.session.query(
func.count(Post.id).label('total_posts'),
func.avg(Post.comment_count).label('avg_comments')
).first()
Form Handling
Django Forms:
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(max_length=100)
email = forms.EmailField()
message = forms.CharField(widget=forms.Textarea)
def clean_email(self):
email = self.cleaned_data['email']
if not email.endswith('@company.com'):
raise forms.ValidationError('Sadece şirket emaili kullanın')
return email
Flask-WTF:
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, validators
class ContactForm(FlaskForm):
name = StringField('Name', [validators.Length(min=1, max=100)])
email = StringField('Email', [validators.Email()])
message = TextAreaField('Message', [validators.Length(min=10)])
def validate_email(self, field):
if not field.data.endswith('@company.com'):
raise validators.ValidationError('Sadece şirket emaili kullanın')
Performans Karşılaştırması
Django Performance Tips
# Select Related kullanımı
posts = Post.objects.select_related('author', 'category').all()
# Prefetch Related için
posts = Post.objects.prefetch_related('tags', 'comments').all()
# Database indexing
class Post(models.Model):
title = models.CharField(max_length=200, db_index=True)
class Meta:
indexes = [
models.Index(fields=['created_at', 'published']),
]
Flask Performance Tips
# Database connection pooling
from sqlalchemy import create_engine
from sqlalchemy.pool import QueuePool
engine = create_engine(
DATABASE_URL,
poolclass=QueuePool,
pool_size=20,
max_overflow=0
)
# Caching with Flask-Cache
from flask_caching import Cache
cache = Cache(app, config={'CACHE_TYPE': 'simple'})
@cache.memoize(timeout=300)
def get_popular_posts():
return Post.query.order_by(Post.view_count.desc()).limit(10).all()
Sonuç ve Öneriler
Django ve Flask arasındaki seçim, projenizin gereksinimlerine bağlıdır:
🚀 Hızlı geliştirme ve tam özellik seti → Django ⚡ Esneklik ve minimalizm → Flask
Her iki framework de Python ekosisteminin güçlü temsilcileridir. Doğru seçim, projenizin boyutu, karmaşıklığı ve gelecekteki büyüme planlarınıza bağlıdır.
Başlangıç önerisi: Python web geliştirmeye yeni başlıyorsanız Flask ile başlayın, daha sonra Django'yu öğrenin. Bu sıralama her iki framework'ü de daha iyi anlamanızı sağlayacaktır.