Python İle Flask Çerçevesini Kullanarak Dinamik Bir Web Sitesi Nasıl Yapılır?

Python İle Flask Çerçevesini Kullanarak Dinamik Bir Web Sitesi Nasıl Yapılır?
Python İle Flask Çerçevesini Kullanarak Dinamik Bir Web Sitesi Nasıl Yapılır?

Gereksinimler ve Geliştirme Ortamı Kurulumu

Projeye başlamadan önce bilgisayarınızda Python 3.12 veya daha yeni bir sürümün yüklü olduğundan emin olmalısınız. Flask ile çalışırken sisteminizi kirletmemek adına mutlaka bir "sanal ortam" (virtual environment) oluşturmalısınız. Bu, projenize özel kütüphanelerin sistem genelinden izole edilmesini sağlar.

Terminal veya komut satırınızı açarak aşağıdaki komutları sırasıyla uygulayın:

# Proje klasörünü oluşturun
mkdir flask_dinamik_site
cd flask_dinamik_site

# Sanal ortamı oluşturun
python -m venv venv

# Sanal ortamı aktif edin (Windows için)
venv\Scripts\activate

# Sanal ortamı aktif edin (Linux/macOS için)
source venv/bin/activate

# Flask kurulumu
pip install flask

Kurulum tamamlandıktan sonra pip list komutu ile Flask ve bağımlılıklarının yüklendiğini doğrulayabilirsiniz. Artık temel web sunucunuzu ayağa kaldırmaya hazırsınız.

Flask ile İlk Web Uygulamasını Çalıştırma

Flask'ın çalışma mantığı, belirli URL rotalarını (route) Python fonksiyonlarıyla eşleştirmektir. Bir "Merhaba Dünya" uygulaması, Flask'ın nasıl çalıştığını anlamak için en iyi örnektir. app.py adında bir dosya oluşturun.

from flask import Flask

app = Flask(__name__)

@app.route('/')
def ana_sayfa():
    return "


Flask ile dinamik web dünyasına hoş geldiniz!

" if __name__ == '__main__': app.run(debug=True)

Yukarıdaki kodda @app.route('/') dekoratörü, tarayıcıdan ana sayfaya bir istek geldiğinde ana_sayfa fonksiyonunun çalışmasını sağlar. debug=True parametresi, kodda yaptığınız değişikliklerin sunucuyu yeniden başlatmadan algılanmasını sağlar; bu özellik sadece geliştirme aşamasında kullanılmalıdır.

Jinja2 Şablon Motoru ile Dinamik İçerik Yönetimi

Web sitenizi dinamik yapan şey, veritabanından veya kullanıcılardan gelen verileri HTML içine gömmektir. Flask, bunun için güçlü bir şablon motoru olan Jinja2'yi kullanır. HTML dosyalarınızı projenin ana dizininde templates klasörü içinde tutmalısınız.

templates/index.html dosyasını şu şekilde oluşturun:




    Dinamik Site


    

Merhaba, {{ isim }}!

Bugün tarih: {{ tarih }}

Şimdi Python tarafında bu şablonu render edelim:

from flask import Flask, render_template
from datetime import datetime

app = Flask(__name__)

@app.route('/')
def karsilama(isim):
    return render_template('index.html', isim=isim, tarih=datetime.now().strftime("%d-%m-%Y"))

Burada {{ }} işaretleri Jinja2'nin değişkenleri HTML içine yerleştirmesini sağlar. URL'den gelen isim parametresini dinamik olarak sayfaya yansıttık.

Flask ve Veritabanı Entegrasyonu (SQLAlchemy)

Dinamik bir web sitesinin kalbi veritabanıdır. Flask ile en yaygın kullanılan ORM (Object Relational Mapper) aracı SQLAlchemy'dir. Bu araç, SQL sorguları yazmak yerine Python sınıflarıyla veritabanı yönetmenizi sağlar.

Öncelikle pip install flask-sqlalchemy komutu ile kütüphaneyi kurun ve uygulamanıza ekleyin:

from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)

class Kullanici(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    kullanici_adi = db.Column(db.String(50), nullable=False)

# Veritabanını oluşturmak için:
# with app.app_context():
#     db.create_all()

Bu yapı, veritabanı tablolarınızı Python sınıfları olarak tanımlamanıza olanak tanır. nullable=False ifadesi, veritabanı seviyesinde veri bütünlüğünü korumak için zorunlu alanlar oluşturur.

Güvenli Form İşlemleri ve Kullanıcı Etkileşimi

Kullanıcıdan veri alırken her zaman dikkatli olmalısınız. XSS (Cross-Site Scripting) saldırılarına karşı Flask'ın şablon motoru otomatik olarak çıktıları "escape" eder (HTML etiketlerini etkisiz hale getirir). Ancak yine de form verilerini doğrulamak için WTForms kütüphanesini kullanmak en iyi pratiktir.

from flask import request

@app.route('/kayit', methods=['GET', 'POST'])
def kayit():
    if request.method == 'POST':
        yeni_kullanici = request.form.get('kullanici_adi')
        # Veritabanına kaydetme işlemleri buraya gelecek
        return f"Hoş geldin {yeni_kullanici}"
    return 'Kaydet'

Bu örnekte methods=['GET', 'POST'] kullanarak hem formun görüntülendiği hem de verinin gönderildiği süreci yönettik. Güvenlik için asla kullanıcıdan gelen veriyi doğrudan veritabanı sorgusuna (SQL Injection riski nedeniyle) eklemeyin; her zaman ORM yöntemlerini tercih edin.

Flask Uygulaması İçin Karşılaştırma Tablosu

Yöntem Avantajı Dezavantajı
Flask (Mikro) Hızlı geliştirme, esneklik Büyük projelerde yapılandırma gerektirir
Django (Full-stack) Hazır admin paneli, güvenlik Öğrenme eğrisi daha dik
FastAPI Yüksek performans, asenkron Daha yeni bir ekosistem
Kritik Güvenlik Uyarısı: Üretim ortamına (production) geçmeden önce debug=True modunu mutlaka kapatın. Gizli anahtarlarınızı (SECRET_KEY) asla kod içinde saklamayın, ortam değişkenleri (environment variables) kullanın. SQL Injection saldırılarına karşı her zaman parametreli sorgular veya ORM kullanın.

Sıkça Sorulan Sorular

Flask ile büyük ölçekli projeler yapılabilir mi?

Evet, Flask "mikro" bir çerçeve olsa da, doğru mimari (Blueprint yapısı kullanarak) ile kurumsal seviyede büyük uygulamalar geliştirmek mümkündür.

Veritabanı olarak sadece SQLite mı kullanılır?

Hayır, Flask SQLAlchemy aracılığıyla PostgreSQL, MySQL ve MariaDB gibi birçok popüler veritabanı sistemiyle tam uyumlu çalışır.

Flask uygulaması nasıl yayına alınır?

Flask uygulamaları genellikle Gunicorn veya uWSGI gibi WSGI sunucuları üzerinde, Nginx veya Apache arkasında çalıştırılarak yayına alınır.

Şablonlarda CSS ve JS dosyalarını nasıl bağlarım?

Flask'ta statik dosyalar static klasöründe tutulur ve şablonlarda {{ url_for('static', filename='style.css') }} şeklinde çağrılır.

Kullanıcı girişi güvenli mi?

Kullanıcı girişleri için Flask-Login eklentisini ve şifreleri hashlemek için Werkzeug.security kütüphanesini kullanmak standarttır; asla düz metin şifre saklamayın.

Flask Uygulamalarında Hata Ayıklama ve Hata Yönetimi

Geliştirme sürecinde hatalarla karşılaşmak kaçınılmazdır. Flask, geliştiricilere hataları hızlıca tespit etmeleri için güçlü araçlar sunar. Uygulamanızı geliştirirken debug=True modunu kullanmak, tarayıcı üzerinde interaktif bir hata ayıklayıcı (debugger) sağlar. Ancak, bu modun canlı (production) ortamda asla açık bırakılmaması gerektiğini unutmamalısınız.

Özel Hata Sayfaları Oluşturma

Kullanıcılarınızın 404 (Sayfa Bulunamadı) veya 500 (Sunucu Hatası) gibi hatalarla karşılaştığında standart hata sayfaları yerine, sitenizin tasarımına uygun özel sayfalar görmesi profesyonel bir yaklaşımdır. Aşağıdaki örnek, uygulamanızda özel hata sayfalarını nasıl yöneteceğinizi gösterir:

from flask import Flask, render_template

app = Flask(__name__)

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

@app.errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'), 500

Flask Uygulamaları İçin Performans İpuçları

Uygulamanız büyüdükçe performans optimizasyonu kritik bir hale gelir. Flask, "mikro" bir çerçeve olduğu için performans darboğazları genellikle veritabanı sorguları veya yoğun hesaplama gerektiren işlemlerden kaynaklanır.

  • Veritabanı Sorgularını Optimize Edin: N+1 sorgu probleminden kaçınmak için SQLAlchemy'nin joinedload veya subqueryload özelliklerini kullanarak ilişkili verileri tek seferde çekin.
  • Önbellekleme (Caching) Kullanın: Sık değişmeyen veriler için Flask-Caching eklentisini kullanarak veritabanı yükünü ciddi oranda azaltabilirsiniz.
  • WSGI Sunucusu Seçimi: Geliştirme aşamasında kullanılan yerleşik sunucu yerine, canlı ortamda Gunicorn veya uWSGI gibi performans odaklı WSGI sunucuları tercih edilmelidir.

Gunicorn ile Uygulamayı Yayına Hazırlama

Uygulamanızı bir sunucuda çalıştırmak için şu komutu kullanabilirsiniz:

# Uygulamanızı 4 işçi süreci ile başlatır
gunicorn --workers 4 --bind 0.0.0.0:8000 app:app

Bu yapılandırma, uygulamanızın eş zamanlı gelen istekleri daha verimli işlemesini sağlar. Ayrıca, statik dosyalarınızı (CSS, JS, Resimler) doğrudan Flask üzerinden değil, Nginx gibi bir web sunucusu üzerinden servis etmek, uygulamanızın yanıt süresini (latency) önemli ölçüde iyileştirecektir.

Profesyonel İpucu: Uygulamanızda ağır işlemler (örneğin e-posta gönderme veya büyük veri işleme) varsa, bunları ana döngüden çıkarıp Celery ve Redis kullanarak arka plan görevleri (background tasks) olarak çalıştırmanız, kullanıcı deneyimini kesintisiz tutmanızı sağlar.

Sonuç

Python ile Flask çerçevesini kullanarak dinamik bir web sitesi geliştirmek, hem yazılım mimarisini anlamanızı sağlar hem de size hızlı sonuç alma imkanı sunar. Bu rehberde temel kurulumdan veritabanı yönetimine kadar kritik adımları inceledik. Bir sonraki adımda, Flask-Login ile kullanıcı oturum yönetimi ekleyerek ve Flask-Migrate ile veritabanı şema değişikliklerinizi yöneterek projenizi bir üst seviyeye taşıyabilirsiniz. Başarılar dilerim.

Bu yazıya tepkinizi paylaşın:
Kerem Tekin

Hobi ve kişisel gelişim alanında içerik editörlüğü yapıyorum. Okuyuculara yeni beceriler kazandıran, net ve anlaşılır nasıl yapılır makaleleri yazıyorum.

Yorumlar (0)

Yorum Yaz