İnternetin erken dönemlerindeki o sade ve etkili blog kültürünü hatırlıyor musunuz? Kendi içeriklerimizi paylaştığımız, kontrolün tamamen bizde olduğu o platformlar… Günümüzde devasa platformlar olsa da, kendi İçerik Yönetim Sisteminizi (CMS) geliştirmek, hem web geliştirme temellerini öğrenmek hem de uygulamanın nasıl çalıştığına tam hakim olmak adına harika bir pratiktir.
Bu yazımızda, Python, Flask ve SQLite kullanarak geliştirdiğimiz, kullanıcı kayıt sisteminden yazı yönetimine kadar her şeyi kapsayan hafif ve işlevsel bir blog uygulamasını inceleyeceğiz.
🚀 Projenin Genel Yetenekleri
Bu uygulama, sadece yazı paylaşmaktan ibaret değil; gerçek bir web uygulamasının sahip olması gereken temel yapı taşlarını barındırıyor:
- Tam Kontrollü İçerik Yönetimi (CRUD): Yazarlar kendi yazılarını oluşturabilir, düzenleyebilir ve silebilir.
- Güvenli Kimlik Doğrulama: Kullanıcı kayıtları, giriş/çıkış işlemleri ve şifreleme mekanizmaları.
- Korumalı Alanlar: Sadece giriş yapmış kullanıcıların erişebildiği özel bir yönetim paneli (Dashboard).
- Kullanıcı Profil Yönetimi: Şifre güncelleme ve hesap silme gibi kritik hesap işlemleri.
- Dinamik İçerik Akışı: Tüm kullanıcıların yazılarını tarih sırasına göre listeleyen ana sayfa.
🛠️ Kodun Anatomisi
Projeyi incelediğimizde, geliştirme ortamı ve temel bilgileri şu şekildedir:
Proje Detayları
- Yazar: Ahmet Aksoy
- Tarih: 17 Nisan 2026
- Ortam: Python 3.12 / Ubuntu 24.04
- Temel Teknolojiler: Flask, SQLite, Bcrypt
🔍 Teknik Derinlik: Nasıl Çalışıyor?
1. Güvenliğin Temeli: Bcrypt ile Şifreleme
Web uygulamalarında şifreleri asla düz metin (plain text) olarak saklamamalıyız. Bu projede bcrypt kütüphanesi kullanılarak şifreler “hash”lenir. Bcrypt, her şifre için rastgele bir “salt” ekleyerek aynı şifrenin bile farklı hash’ler üretmesini sağlar, bu da saldırganlar için şifre kırma işlemini neredeyse imkansız hale getirir.
import bcrypt
def hash_password(plain):
# Şifreyi bayt dizisine çevir ve tuzla (salt)
return bcrypt.hashpw(plain.encode(), bcrypt.gensalt()).decode()
def check_password(plain, hashed):
# Girilen şifreyi kayıtlı hash ile karşılaştır
return bcrypt.checkpw(plain.encode(), hashed.encode())
2. Akıllı Erişim Kontrolü: @login_required Dekoratörü
Uygulamanın bazı sayfaları (örneğin yazı ekleme sayfası veya profil ayarları) herkese açık olmamalıdır. Bunu sağlamak için Python’ın dekoratör yapısını kullandık. functools.wraps ile sarmalanmış bu özel fonksiyon, kullanıcı oturum açmamışsa onu otomatik olarak giriş sayfasına yönlendirir.
from functools import wraps
from flask import session, flash, redirect, url_for
def login_required(f):
@wraps(f)
def decorated(*args, **kwargs):
if not session.get('user_id'):
flash('Bu sayfaya erişmek için lütfen giriş yapın.', 'error')
return redirect(url_for('login'))
return f(*args, **kwargs)
return decorated
3. Veritabanı İlişkileri ve SQLite
Projede iki temel tablo bulunmaktadır: users (kullanıcılar) ve posts (yazılar). Yazılar tablosundaki user_id alanı, kullanıcılar tablosuna bir Foreign Key (Yabancı Anahtar) ile bağlıdır. Bu sayede her yazının hangi kullanıcıya ait olduğunu biliriz.
Ana sayfada tüm yazıları ve yazarlarını listelemek için SQL’in JOIN yapısını kullandık:
SELECT p.*, u.username
FROM posts p
JOIN users u ON p.user_id = u.id
ORDER BY p.created_at DESC
4. Kullanıcı Deneyimi ve Arayüz
Arayüz tarafında Jinja2 şablon motoru kullanılmıştır. base.html isimli bir ana şablon oluşturarak navigasyon çubuğu ve hata/başarı mesajları (Flash messages) gibi ortak bileşenlerin her sayfada tekrarlanmasını önledik.
🏁 Sonuç
Bu mini CMS projesi, bir web uygulamasının can damarı olan “Kimlik Doğrulama $\rightarrow$ Yetkilendirme $\rightarrow$ Veri Yönetimi” döngüsünü anlamak için mükemmel bir örnektir. Flask’ın hafifliği ve SQLite’ın kurulum gerektirmeyen yapısı, hızlı prototipleme yapmak isteyenler için ideal bir ikilidir.
Siz de kendi blog sisteminizi geliştirirken bu yapıları temel alabilir, üzerine “Kategori Sistemi”, “Yorumlar” veya “Markdown Desteği” gibi yeni özellikler ekleyerek projeyi genişletebilirsiniz.
Ahmet Aksoy
Not: Bu yazıda incelediğimiz kodu ve benzer projelerin kaynak kodlarını https://github.com/ahmetax/practical-python-examples adresinde bulabilirsiniz.
Flask, #Python, #SQLite, #WebGeliştirme, #CMS