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 setiDjangoEsneklik ve minimalizmFlask

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.