Kendi Blog Sisteminizi Kurun: Flask ve SQLite ile Mini CMS Geliştirme

İ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

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir