Yükleniyor...

Flask Rehberi: Python ile Modern Backend ve API Geliştirme

Yazar: Burak Balkı | Kategori: Backend Development | Okuma Süresi: 9 dk

Bu kapsamlı Flask rehberi, Python ile modern backend geliştirmeye dair kurulum, routing, veritabanı yönetimi ve best practices konularını adım adım ve profes...

## Flask Nedir ve Neden Tercih Edilmelidir? **Flask**, Python programlama dili ile yazılmış, hafif (micro) bir web framework'üdür. 'Mikro' terimi, Flask'ın çekirdek özelliklerinin basit ama genişletilebilir olduğu anlamına gelir. Django gibi 'pilleri dahil' (batteries-included) bir yaklaşım yerine, Flask geliştiricilere ihtiyaç duydukları bileşenleri seçme özgürlüğü tanır. Flask'ın tercih edilme nedenleri: - **Esneklik:** Proje yapısını tamamen geliştirici belirler. - **Hafiflik:** Gereksiz kütüphane yükü getirmez. - **Ölçeklenebilirlik:** Küçük projelerden karmaşık mikroservis mimarilerine kadar genişleyebilir. - **Geniş Ekosistem:** Flask-SQLAlchemy, Flask-Migrate ve Flask-JWT-Extended gibi güçlü eklentilere sahiptir. ## Flask Kurulumu ve Geliştirme Ortamının Hazırlanması Profesyonel bir Flask projesine başlarken **Virtual Environment (Sanal Ortam)** kullanmak, bağımlılık çakışmalarını önlemek için kritiktir. ### 1. Sanal Ortam Oluşturma ```bash # Proje dizinine gidin mkdir flask-projesi && cd flask-projesi # Sanal ortam oluşturun python -m venv venv # Sanal ortamı aktif edin (Windows) .\\venv\\Scripts\\activate # Sanal ortamı aktif edin (macOS/Linux) source venv/bin/activate ``` ### 2. Flask Paketinin Yüklenmesi ```bash pip install Flask ``` ## İlk Flask Uygulaması: Hello World En temel seviyede bir Flask uygulaması, bir uygulama nesnesi oluşturmayı ve rotaları (routes) tanımlamayı içerir. ```python from flask import Flask app = Flask(__name__) @app.route('/') def index(): return "Flask Dünyasına Hoş Geldiniz!" if __name__ == '__main__': app.run(debug=True) ``` > **Önemli Not:** `debug=True` parametresi, geliştirme aşamasında kodda yapılan değişikliklerin otomatik olarak algılanmasını ve tarayıcıda detaylı hata raporları sunulmasını sağlar. Prodüksiyon ortamında asla aktif edilmemelidir. ## Routing ve Dinamik URL Yapılandırması Flask, modern ve SEO uyumlu URL yapıları oluşturmak için dekoratörleri kullanır. Dinamik parametreler sayesinde kullanıcı bazlı sayfalar oluşturulabilir. ```python @app.route('/user/') def show_user_profile(username): return f'Kullanıcı: {username}' @app.route('/post/') def show_post(post_id): return f'Makale ID: {post_id}' ``` | Tip Değiştirici | Açıklama | | :--- | :--- | | `string` | Varsayılan tip (slash içermez) | | `int` | Pozitif tam sayılar | | `float` | Ondalıklı sayılar | | `path` | Slash karakterlerini de kabul eden string | | `uuid` | UUID formatındaki veriler | ## Request ve Response Yönetimi Backend geliştirmede istemciden gelen verileri işlemek ve uygun yanıtları dönmek temel süreçtir. Flask'ın `request` nesnesi bu süreci yönetir. ```python from flask import request, jsonify @app.route('/api/data', methods=['POST']) def handle_data(): # JSON verisini al data = request.get_json() if not data: return jsonify({"error": "Veri bulunamadı"}), 400 return jsonify({"message": "Başarılı", "received": data}), 201 ``` ## Jinja2 Template Motoru ile Dinamik İçerik Flask, HTML dosyalarını dinamik verilerle birleştirmek için **Jinja2** motorunu kullanır. Bu, backend verilerinin frontend arayüzüne güvenli bir şekilde aktarılmasını sağlar. ```python from flask import render_template @app.route('/dashboard') def dashboard(): user_data = {"name": "Ahmet", "role": "Admin"} items = ["Raporlar", "Ayarlar", "Kullanıcılar"] return render_template('dashboard.html', user=user_data, items=items) ``` `dashboard.html` örneği: ```html

Hoş geldin, {{ user.name }}

    {% for item in items %}
  • {{ item }}
  • {% endfor %}
``` ## Veritabanı Entegrasyonu: Flask-SQLAlchemy Veritabanı işlemleri için en popüler ORM (Object Relational Mapper) çözümü Flask-SQLAlchemy'dir. Bu yapı, SQL sorguları yazmak yerine Python sınıfları ile veritabanı yönetimi sağlar. ```python from flask_sqlalchemy import SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) def __repr__(self): return f"User('{self.username}', '{self.email}')" ``` ## Blueprints ile Modüler Mimari Büyük ölçekli uygulamalarda tüm kodları tek bir dosyada tutmak sürdürülebilir değildir. **Blueprints**, uygulamayı mantıksal bileşenlere ayırmanıza olanak tanır. ```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') ``` ## Form İşleme ve Flask-WTF Kullanıcıdan veri alırken güvenlik (CSRF koruması) ve doğrulama (validation) işlemleri için Flask-WTF kullanılır. ```python from flask_wtf import FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import DataRequired, Email class ContactForm(FlaskForm): name = StringField('İsim', validators=[DataRequired()]) email = StringField('Email', validators=[DataRequired(), Email()]) submit = SubmitField('Gönder') ``` ## Hata Yönetimi ve Özel Hata Sayfaları Profesyonel bir uygulamada hatalar yakalanmalı ve kullanıcıya anlamlı geri bildirimler verilmelidir. ```python @app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 @app.errorhandler(500) def internal_server_error(e): return jsonify({"error": "Sunucu hatası oluştu"}), 500 ``` ## Best Practices: Ölçeklenebilir Flask Mimarisi Flask projelerinde sürdürülebilirliği artırmak için şu kurallara uyulmalıdır: - **Environment Variables:** Hassas verileri (API key, DB şifresi) `.env` dosyalarında saklayın. - **Application Factory:** Uygulama nesnesini bir fonksiyon içinde oluşturun (`create_app`). - **Logging:** Hataları izlemek için Python'un `logging` modülünü konfigüre edin. - **Schema Validation:** Marshmallow gibi kütüphanelerle girdi verilerini doğrulayın. ## Sık Yapılan Hatalar 1. **Circular Imports:** Blueprint'ler ve modeller arasında iç içe import yapılması. Çözüm: Application Factory pattern. 2. **Global State Kullanımı:** İstekler arası veri paylaşımı için global değişken kullanmak. Çözüm: Flask `g` nesnesi veya veritabanı. 3. **Debug Modu Unutmak:** Canlı sunucuda `debug=True` bırakmak büyük bir güvenlik açığıdır. ## Performans İpuçları - **Caching:** Sık erişilen veriler için Flask-Caching kullanın. - **Gunicorn/Nginx:** Flask'ın yerleşik sunucusu yerine Gunicorn gibi bir WSGI sunucusu ve önünde Nginx kullanın. - **Async Support:** Flask 2.0+ ile gelen `async` desteğini yoğun I/O işlemlerinde değerlendirin. ## Sık Sorulan Sorular (SSS) **1. Flask mı Django mu seçilmeli?** Eğer tam kontrol, esneklik ve mikroservis mimarisi istiyorsanız Flask; hızlıca hazır bileşenlerle (admin paneli, auth vb.) bir CMS veya büyük bir portal yapmak istiyorsanız Django. **2. Flask ile asenkron programlama yapılabilir mi?** Evet, Flask 2.0 sürümüyle birlikte `async def` rotalarını desteklemeye başlamıştır. **3. Flask güvenli mi?** Flask çekirdeği güvenlidir ancak güvenlik eklentileri (Flask-Talisman, Flask-SeaSurf) ve doğru konfigürasyon (CSRF, JWT) geliştiricinin sorumluluğundadır. **4. Flask hangi veritabanlarını destekler?** SQLAlchemy üzerinden PostgreSQL, MySQL, SQLite, Oracle ve SQL Server gibi tüm ilişkisel veritabanlarını destekler. Ayrıca MongoDB gibi NoSQL çözümleriyle de kullanılabilir. **5. Flask uygulaması nasıl deploy edilir?** Genellikle Dockerize edilerek Heroku, AWS EC2 veya DigitalOcean gibi platformlarda Gunicorn/Uvicorn sunucuları ile yayına alınır. ## Özet ve Sonuç Flask, Python ekosisteminin en güçlü ve zarif web framework'lerinden biridir. Bu rehberde kurulumdan başlayarak profesyonel bir backend mimarisinin nasıl kurulacağını inceledik. Flask'ın sunduğu modüler yapı sayesinde, projeniz büyüdükçe sadece ihtiyacınız olan araçları ekleyerek performanslı ve sürdürülebilir bir sistem inşa edebilirsiniz.