Flask Rehberi: Python ile Modern Web Uygulaması Geliştirme
Yazar: Burak Balkı | Kategori: Backend Development | Okuma Süresi: 9 dk
Flask framework'ün temellerinden ileri seviye mimari yapılarına kadar her detayı içeren kapsamlı teknik rehber. Python ile backend geliştirmede best practice...
## Flask Nedir? Mikro Framework Kavramını Anlamak
**Flask**, Python tabanlı, hafif ve esnek bir web çatısıdır (framework). Armin Ronacher tarafından geliştirilen Flask, "mikro framework" olarak tanımlanır. Buradaki "mikro" terimi, framework'ün yeteneklerinin az olduğu anlamına değil, çekirdeğin basit ama genişletilebilir olduğu anlamına gelir.
Flask, veritabanı soyutlama katmanı, form doğrulama veya diğer bileşenleri varsayılan olarak sunmaz. Bunun yerine, projenin ihtiyacına göre eklentiler (extensions) aracılığıyla bu özelliklerin eklenmesine olanak tanır. Bu felsefe, geliştiriciye tam kontrol ve esneklik sağlar.
### Flask Mimarisinin Temel Taşları
Flask iki ana kütüphane üzerine inşa edilmiştir:
1. **Werkzeug:** Bir WSGI (Web Server Gateway Interface) kütüphanesidir. HTTP isteklerini ve yanıtlarını yönetir.
2. **Jinja2:** Python için hızlı ve güvenli bir şablon motorudur.
| Özellik | Flask | Django |
| :--- | :--- | :--- |
| Mimari | Mikro Framework | Monolitik (Full-stack) |
| Esneklik | Çok Yüksek | Sınırlı (Kendi kuralları var) |
| Öğrenme Eğrisi | Düşük | Orta/Yüksek |
| Veritabanı | Eklenti Gerektirir (SQLAlchemy vb.) | Dahili ORM |
| Kullanım Alanı | Mikroservisler, API'lar, Hızlı Prototipler | Büyük Ölçekli Kurumsal Uygulamalar |
## Flask Kurulumu ve Geliştirme Ortamının Hazırlanması
Modern Python geliştirmede, projelerin bağımlılıklarını izole etmek için **Sanal Ortam (Virtual Environment)** kullanmak standart bir uygulamadır.
### Adım 1: Sanal Ortam Oluşturma
```bash
# Proje klasörünü oluşturun
mkdir flask_projesi && cd flask_projesi
# Sanal ortamı oluşturun
python3 -m venv venv
# Sanal ortamı aktif edin (Windows için: venv\\Scripts\\activate)
source venv/bin/activate
```
### Adım 2: Flask Yükleme
```bash
pip install Flask
```
## İlk Flask Uygulaması: Hello World
Flask ile minimal bir uygulama yazmak oldukça basittir. Aşağıdaki kod, `/` rotasına gelen isteklere yanıt veren temel bir sunucu oluşturur.
```python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Merhaba, Flask Dünyası!'
if __name__ == '__main__':
app.run(debug=True)
```
> **Önemli Not:** `debug=True` parametresi, geliştirme aşamasında kod değişikliklerinin otomatik olarak algılanmasını ve hataların tarayıcıda detaylı gösterilmesini sağlar. Canlı (Production) ortamda asla aktif edilmemelidir.
## Yönlendirme (Routing) ve Dinamik URL Yapıları
Flask'ta URL'leri Python fonksiyonlarına bağlamak için `@app.route` dekoratörü kullanılır. Modern web uygulamalarında dinamik URL parametreleri kritik öneme sahiptir.
```python
@app.route('/user/')
def show_user_profile(username):
return f'Kullanıcı: {username}'
@app.route('/post/')
def show_post(post_id):
return f'Yazı ID: {post_id}'
```
Flask şu değişken tiplerini destekler:
- `string`: Varsayılan tip (slash içermez)
- `int`: Tam sayılar
- `float`: Ondalıklı sayılar
- `path`: Slash içeren metinler
- `uuid`: UUID formatındaki veriler
## HTTP Metodları ile Çalışmak
RESTful API geliştirirken farklı HTTP metodlarını (GET, POST, PUT, DELETE) yönetmek gerekir. Flask'ta bu işlem `methods` parametresi ile yapılır.
```python
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return "Giriş yapılıyor..."
else:
return "Giriş sayfası"
```
## Şablon Motoru: Jinja2 Kullanımı
HTML içeriğini Python kodundan ayırmak için **Jinja2** kullanılır. Bu sayede dinamik içerikler güvenli bir şekilde render edilir.
```python
from flask import render_template
@app.route('/hello/')
def hello(name=None):
return render_template('hello.html', name=name)
```
`templates/hello.html` dosyasının içeriği:
```html
Selamlama
{% if name %}
'
```
## Form Yönetimi ve Doğrulama: Flask-WTF
Kullanıcıdan gelen verilerin güvenliği için **Flask-WTF** kullanılır. Bu eklenti CSRF koruması sağlar ve form doğrulamayı kolaylaştırır.
```python
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
class NameForm(FlaskForm):
name = StringField('İsminiz nedir?', validators=[DataRequired()])
submit = SubmitField('Gönder')
```
## Uygulama Mimarisi: Blueprints
Büyük projelerde tüm rotaları tek bir dosyada tutmak sürdürülebilir değildir. **Blueprints**, uygulamayı modüler parçalara bölmenizi sağlar.
```python
# auth.py
from flask import Blueprint
auth_bp = Blueprint('auth', __name__)
@auth_bp.route('/login')
def login():
return "Giriş Sayfası"
# app.py
from auth import auth_bp
app.register_blueprint(auth_bp, url_prefix='/auth')
```
## Hata Yönetimi ve Loglama
Profesyonel uygulamalarda hatalar şık bir şekilde ele alınmalı ve kaydedilmelidir.
```python
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
import logging
logging.basicConfig(filename='error.log', level=logging.ERROR)
```
## Performans İpuçları ve En İyi Uygulamalar (Best Practices)
1. **Gunicorn Kullanın:** Flask'ın dahili sunucusu sadece geliştirme içindir. Production ortamında Gunicorn gibi bir WSGI sunucusu kullanın.
2. **Environment Variables:** Hassas verileri (API anahtarları, DB şifreleri) `.env` dosyalarında saklayın.
3. **Caching:** Sık erişilen veriler için `Flask-Caching` (Redis/Memcached) kullanın.
4. **Async Desteği:** Flask 2.0+ ile gelen `async/await` desteğini kullanarak I/O yoğunluklu işlemleri optimize edin.
5. **Veritabanı İndeksleme:** Sık sorgulanan sütunlara indeks ekleyerek performansı artırın.
## Sık Yapılan Hatalar
- **DEBUG Modu:** Canlı ortamda `debug=True` bırakmak güvenlik açığı yaratır.
- **Dairesel Importlar:** Modüler yapıda dosyaların birbirini içe aktarması (circular import) hatalarına dikkat edilmelidir.
- **Global Değişkenler:** İstekler (requests) arasında veri paylaşmak için global değişken kullanmak, thread-safety sorunlarına yol açar.
## Sık Sorulan Sorular (SSS)
**1. Flask ölçeklenebilir mi?**
Evet, Blueprint yapısı ve mikroservis mimarisine uygunluğu sayesinde çok büyük ölçekli uygulamalar geliştirilebilir. Pinterest ve LinkedIn gibi devler bazı servislerinde Flask kullanmaktadır.
**2. Flask öğrenmek için Python bilmek şart mı?**
Kesinlikle. Flask bir Python kütüphanesidir, bu nedenle temel Python yapılarına hakim olmanız gerekir.
**3. Flask ile API geliştirmek mantıklı mı?**
Evet, özellikle `Flask-RESTful` veya `Flask-Marshmallow` gibi eklentilerle hızlı ve performanslı REST API'lar geliştirilebilir.
**4. Django mu Flask mı tercih edilmeli?**
Eğer projeniz standart bir yapıdaysa (admin paneli, kullanıcı yönetimi vb. hemen hazır olsun istiyorsanız) Django; eğer özgürlük ve hafiflik istiyorsanız Flask tercih edilmelidir.
**5. Flask asenkron işlemleri destekliyor mu?**
Evet, Flask 2.0 sürümüyle birlikte asenkron view fonksiyonları resmi olarak desteklenmektedir.
## Özet
Flask, sadeliği ve esnekliği bir araya getiren güçlü bir framework'tür. Bu rehberde, kurulumdan başlayarak veritabanı yönetimi, formlar ve modüler mimari gibi kritik konulara değindik. Flask ile geliştirme yaparken en önemli kural, ihtiyacınız olan bileşenleri doğru eklentilerle sisteme dahil etmektir.