İki geliştirme yığını karşılaştırmanın en iyi yolu, aynı projeyi her biriyle iki kez inşa etmektir. Django ve Express.js ile yaptığım tam olarak bu oldu: kullanıcı rolleri, medya yüklemeleri ve şablonlu arayüzlere sahip bir CMS oluşturdum. Amaç sadece özelliklerdeki eşitlik değil, davranışlardaki eşitlikti; böylece web geliştirmeye dair bu iki farklı yaklaşımdaki adil ve bilgilendirici bir karşılaştırma sağlandı.
Yan Yana Teknik Test
Proje, standart bir blog/CMS idi ve temel gereksinimleri vardı: kullanıcı kimlik doğrulaması, gönderi oluşturma ve düzenleme, medya işleme ve kullanıcılar ile yöneticiler için rol tabanlı erişim. Arayüzde Bootstrap 5 kullanılan şablonlu düzenler kullanıldı, böylece odak estetikten çok arka uç mantığı ve mimarisindeydi.
İşte yığınların nasıl karşılaştırıldığı:
- Çalıştırma zamanı: Node.js ile Express.js (JavaScript) vs Python 3.13 ile Django
- Veritabanı: Mongoose üzerinden MongoDB vs Django ORM üzerinden SQLite
- Kimlik Doğrulama: Cookie işlemeli manuel JWT kurulumu vs Django’nun yerleşik kimlik doğrulama sistemi
- Medya İşleme: multer ile sunucu tarafı dosya yüklemeleri vs Django’nun
FileFieldveImageField - Şablonlama: Bootstrap 5 ile EJS vs Bootstrap 5 ile Django Şablonları
Her iki uygulama da paralel olarak geliştirildi ve işlevsel eşitlik öncelikliydi. Tam kod daha derin inceleme için ayrı depolarda mevcut.
Kimlik Doğrulama: Çerçeve Ayrımı
En göze çarpan fark, kimlik doğrulamada ortaya çıktı—özellikle kimlik doğrulamanın kim tarafından uygulandığı.
Express.js: Tam Geliştirici Kontrolü (ve Tam Sorumluluk)
Express.js’de kimlik doğrulama sıfırdan başlar. Geliştirici, parola hashleme ve doğrulama dahil tüm mantığı yazar. Örneğin, parola hashleme HMAC ile SHA-256 ve rastgele oluşturulmuş bir tuz kullanılarak, kullanıcı oluşturma ve giriş sırasında uygulanır:
userSchema.pre("save", function (next) {
const user = this;
if (!user.isModified("password")) return next();
const salt = randomBytes(64).toString();
const passwordHash = createHmac("sha256", salt)
.update(user.password)
.digest("hex");
this.salt = salt;
this.password = passwordHash;
next();
});
userSchema.statics.userValidatorAndTokenise = async function (email, password) {
const user = await this.findOne({ email });
if (!user) throw new Error("Kullanıcı Bulunamadı");
const hashChk = createHmac("sha256", user.salt)
.update(password)
.digest("hex");
if (hashChk !== user.password) throw new Error("Yanlış Parola");
return createUserToken(user);
};Bu kurulum, JWT verme, cookie yönetimi ve rota koruması gibi tüm işlemlerin elle yapılmasını gerektirir—ayrı dosyalarda ve mantık yollarında.
- Avantajlar: Tam şeffaflık. Her adım görünür ve özelleştirilebilir.
- Dezavantajlar: Her adım aynı zamanda potansiyel bir güvenlik açığı ya da hata kaynağıdır.
Django: Minimum Kodla Hazır Güvenlik
Django’nun karşılığı aynı kimlik doğrulama akışını tek bir model ve birkaç satır kodla halleder. Kullanıcı profil modeli, örneğin, profil resimleri gibi özel alanlar eklerken kimlik doğrulama mantığını genişletir:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(default="default.jpg", upload_to="profile_pics")
def __str__(self):
return f"{self.user.username}'nın Profili"
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
img = Image.open(self.image.path)
if img.height > 480 or img.width > 480:
img.thumbnail((480, 480))
img.save(self.image.path)Parola hashleme, oturum yönetimi, giriş görünümleri, CSRF koruması ve yönetici panosu hepsi django.contrib.auth tarafından tek bir satırda içe aktarılarak halledilir. Sistem kanaatkar olsa da üretime hazırdır.
- Avantajlar: Güvenlik varsayımları üretime hazırdır. Geliştirme süresi önemli ölçüde azalır.
- Dezavantajlar: Detaylı kontrole ihtiyaç duyan geliştiriciler için esneklik daha azdır.
Veri Modelleme: Esneklik vs. Bütünlük
MongoDB ve Django
Yapay zeka özeti
Compare Django and Express.js by building the same CMS twice. See where each framework excels in speed, security, and developer control.