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
joinedloadveyasubqueryloadözelliklerini kullanarak ilişkili verileri tek seferde çekin. - Önbellekleme (Caching) Kullanın: Sık değişmeyen veriler için
Flask-Cachingeklentisini 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
GunicornveyauWSGIgibi 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ıpCeleryveRediskullanarak 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.


Yorumlar (0)
Yorum Yaz