Cover

📘 Flask Nedir?

Flask, Python ile web uygulamaları geliştirmek için kullanılan, hafif (micro) bir web framework’tür.
Yani sana hem web sitesi hem de API yazma imkânı verir.

Avantajları:

  • Basit ve esnek yapı
  • Gerektiğinde genişletilebilir (örnek: SQLAlchemy, JWT, Blueprint)
  • Küçük projelerden büyük sistemlere kadar uygundur

⚙️ Kurulum

İsterseniz önce sanal ortam oluşturabilirsiniz.
Bir klasöre gittikten sonra:

python -m venv venv
source venv/bin/activate

ve sonra;

pip install Flask

🚀 İlk Flask Uygulama (hello.py)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Merhaba, Flask!"

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

Bu dosyayı kaydedip çalıştırın;

python hello.py

Sonra tarayıcıdan şu adrese git: http://127.0.0.1:5000

Ekranda “Merhaba Flask!” yazısını göreceksin.

🌐 Route Nedir?

Route, bir URL’nin hangi fonksiyonu çalıştıracağını belirler. Yani kullanıcı belirli bir adrese girdiğinde hangi içeriğin döneceğini sen belirlersin.

Örnek bir dosya;

from flask import Flask

app = Flask(__name__)

@app.route(/)
def home():
    return Ana Sayfa

@app.route(/hakkinda)
def about():
    return Hakkında Sayfası

@app.route(/iletisim)
def contact():
    return İletişim Sayfası

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

Bu örnekte:

  • / → “Ana Sayfa”
  • /hakkinda → “Hakkında Sayfası”
  • /iletisim → “İletişim Sayfası” döner.

Değişken URL Parametreleri

Bazı sayfalar dinamik olabilir:

@app.route(/kullanici/<isim>)
def kullanici(isim):
    return fMerhaba, {isim.capitalize()}!”

Tarayıcıda http://127.0.0.1:5000/kullanici/yavuz yazarsan: “Merhaba, Yavuz!” sonucu gelir.

📦 Flask’ta request Nesnesi

Flask, gelen verileri okumak için request nesnesini sağlar:

from flask import Flask, request

app = Flask(__name__)

@app.route(/merhaba, methods=[GET, POST])
def merhaba():
    if request.method == POST:
        isim = request.form.get(isim)
        return fMerhaba, {isim}!”
    return ‘’‘
        <form method=POST>
            <input name=isim placeholder=İsmini yaz>
            <button type=submit>Gönder</button>
        </form>
    ‘’‘

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

🧠 Nasıl Çalışır?

GET isteği → form sayfasını gösterir.

POST isteği → kullanıcı formu gönderdiğinde veriyi alır ve ekrana yazar.

🔸 Alternatif: JSON Verisi (API için)

@app.route(/api, methods=[POST])
def api():
    data = request.get_json()
    return {mesaj: fMerhaba {data[isim]}}

Bu örnekte JSON gönderirsen:

{
    "isim": "Yavuz"
}

Cevap olarak:

{
    "mesaj": "Merhaba Yavuz"
}

🧩 Jinja2 Nedir?

Flask, HTML sayfalarını dinamik hale getirmek için Jinja2 adlı bir şablon motoru kullanır. Bu sayede Python verilerini HTML içine kolayca yerleştirebilirsin.

Klasör Yapısı

Flask şablonları varsayılan olarak templates klasöründe bulunur. Yani şöyle bir yapı kur:

proje/
 ├── app.py
 └── templates/
      └── index.html

🔹 app.py

from flask import Flask, render_template

app = Flask(__name__)

@app.route(/)
def home():
    isim = Yavuz
    return render_template(index.html, isim=isim)

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

🔹 templates/index.html

<!DOCTYPE html>
<html>
<head>
    <title>Flask Şablon</title>
</head>
<body>
    <h1>Merhaba !</h1>
    <p>Flask ve Jinja2 harika bir ikili 🚀</p>
</body>
</html>

🤝 Flask ile Veritabanı Bağlantısı

Küçük projeler için genelde SQLite + SQLAlchemy kullanılır.

Kurulum

pip install flask_sqlalchemy

Basit Yapı

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config[SQLALCHEMY_DATABASE_URI] = sqlite:///veritabani.db
db = SQLAlchemy(app)

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

# İlk tabloyu oluştur
with app.app_context():
    db.create_all()

@app.route(/)
def index():
    kullanicilar = Kullanici.query.all()
    return <br>.join([k.isim for k in kullanicilar])

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

📐 Blueprint ile Modüller Yapı

Flask’te Blueprint, uygulamanızı modüler parçalara ayırmanızı sağlayan bir yapıdır. Büyük projeleri organize etmek için kullanılır.

Neden Blueprint?

Tek bir app.py dosyasında yüzlerce route yazmak yerine, uygulamanızı mantıksal bölümlere ayırırsınız:

  • auth (giriş/kayıt)
  • blog (blog işlemleri)
  • admin (yönetim paneli)

Basit Örnek

Proje Yapısı:

myapp/
├── app.py
├── auth/
│   ├── __init__.py
│   └── routes.py
└── blog/
    ├── __init__.py
    └── routes.py

auth/routes.py:

from flask import Blueprint, render_template

auth_bp = Blueprint(auth, __name__, url_prefix=/auth)

@auth_bp.route(/login)
def login():
    return Login sayfası

@auth_bp.route(/register)
def register():
    return Kayıt sayfası

blog/routes.py:

from flask import Blueprint

blog_bp = Blueprint(blog, __name__, url_prefix=/blog)

@blog_bp.route(/)
def index():
    return Blog anasayfa

@blog_bp.route(/post/<int:id>)
def post(id):
    return fBlog yazısı {id}

app.py:

from flask import Flask
from auth.routes import auth_bp
from blog.routes import blog_bp

app = Flask(__name__)

# Blueprint’leri kaydet
app.register_blueprint(auth_bp)
app.register_blueprint(blog_bp)

@app.route(/)
def home():
    return Ana sayfa

if __name__ == __main__:
    app.run(debug=True)
  • /auth/login → auth blueprint
  • /blog/post/5 → blog blueprint
  • / → ana uygulama Her modül kendi route’larını, template’lerini ve static dosyalarını yönetir. Kod daha temiz ve bakımı kolay olur!

🚌 Flask ile RESTful API

Örneğin kitap ekle, güncelle ve silme yapabileceğimiz küçük bir API.

from flask import Flask, jsonify, request

app = Flask(__name__)

# Örnek veri (normalde veritabanından gelir)
kitaplar = [
    {id: 1, baslik: Python Öğreniyorum, yazar: Ahmet Yılmaz, yil: 2023},
    {id: 2, baslik: Flask ile Web, yazar: Ayşe Kaya, yil: 2024},
    {id: 3, baslik: REST API Geliştirme, yazar: Mehmet Demir, yil: 2024}
]

# Tüm kitapları getir (GET)
@app.route(/api/kitaplar, methods=[GET])
def tum_kitaplar():
    return jsonify({kitaplar: kitaplar, toplam: len(kitaplar)})

# Tek kitap getir (GET)
@app.route(/api/kitaplar/<int:id>, methods=[GET])
def kitap_getir(id):
    kitap = next((k for k in kitaplar if k[id] == id), None)
    if kitap:
        return jsonify(kitap)
    return jsonify({hata: Kitap bulunamadı}), 404

# Yeni kitap ekle (POST)
@app.route(/api/kitaplar, methods=[POST])
def kitap_ekle():
    veri = request.get_json()
    
    yeni_kitap = {
        id: len(kitaplar) + 1,
        baslik: veri.get(baslik),
        yazar: veri.get(yazar),
        yil: veri.get(yil)
    }
    
    kitaplar.append(yeni_kitap)
    return jsonify(yeni_kitap), 201

# Kitap güncelle (PUT)
@app.route(/api/kitaplar/<int:id>, methods=[PUT])
def kitap_guncelle(id):
    kitap = next((k for k in kitaplar if k[id] == id), None)
    
    if not kitap:
        return jsonify({hata: Kitap bulunamadı}), 404
    
    veri = request.get_json()
    kitap[baslik] = veri.get(baslik, kitap[baslik])
    kitap[yazar] = veri.get(yazar, kitap[yazar])
    kitap[yil] = veri.get(yil, kitap[yil])
    
    return jsonify(kitap)

# Kitap sil (DELETE)
@app.route(/api/kitaplar/<int:id>, methods=[DELETE])
def kitap_sil(id):
    global kitaplar
    kitap = next((k for k in kitaplar if k[id] == id), None)
    
    if not kitap:
        return jsonify({hata: Kitap bulunamadı}), 404
    
    kitaplar = [k for k in kitaplar if k[id] != id]
    return jsonify({mesaj: Kitap silindi}), 200

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

Test etmek için:

# Tüm kitapları listele
curl http://localhost:5000/api/kitaplar

# Tek kitap getir
curl http://localhost:5000/api/kitaplar/1

# Yeni kitap ekle
curl -X POST http://localhost:5000/api/kitaplar \
  -H “Content-Type: application/json” \
  -d{”baslik”:”Yeni Kitap”,”yazar”:”Ali Veli”,”yil”:2025}# Kitap güncelle
curl -X PUT http://localhost:5000/api/kitaplar/1 \
  -H “Content-Type: application/json” \
  -d{”baslik”:”Güncellenmiş Başlık”}# Kitap sil
curl -X DELETE http://localhost:5000/api/kitaplar/2

🚨Global Hata Ekleme

Bazı sunucu hata kodları için şunlar eklenebilir.

# Global Error Handlers
@app.errorhandler(404)
def not_found(error):
    return jsonify({hata: Endpoint bulunamadı}), 404

@app.errorhandler(500)
def internal_error(error):
    return jsonify({hata: Sunucu hatası}), 500

@app.errorhandler(400)
def bad_request(error):
    return jsonify({hata: Geçersiz istek}), 400

Buraya kadar yazılanlar temel konular. Pratik yaptıkça daha iyi anlayacak ve tecrübe kazanacaksınız.

etiketler

python flask web api rest backend