Neler yeni

Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

  • Merhaba Değerli Ziyaretçimiz, ForumaGel ailesi seni bekliyor! 🌟 Aramıza katılarak güçlü ve samimi topluluğumuzun bir parçası olabilirsin. Burada her üye değerli, her katkı kıymetli. Şimdi üye ol, bizimle birlikte gelişmenin ve keyifli sohbetlerin tadını çıkar! Sevgi ve Saygılarla, ForumaGel Yönetimi ❤️
Yan Yana Banner
Yan Yana Banner
Katılım
7 Nis 2025
Konular
367
Mesajlar
780
Çözümler
1
Tepkime puanı
121
Puan
93
Konum
İstanbul
Web sitesi
forumagel.com
Hazır Kod Bankası - Konu 23: Python Flask API'sini Veritabanına Bağlama (SQLAlchemy ile)




Hazır Kod Bankası Serimizin Yirmi Üçüncü Konusu: Flask API'sini Veritabanına Bağlama!

Merhaba arkadaşlar! Flask ile basit bir web arayüzü ve bir API oluşturmanın temellerini gördük (Konu 20 ve Konu 22). Ayrıca veritabanları ve Flask-SQLAlchemy ile veritabanı entegrasyonu hakkında bilgi edindik (Konu 6, 7, 21). Şimdi bu bilgileri birleştirerek, bir API'nin en temel işlevini yerine getirmesini sağlayalım: veritabanında kalıcı olarak veri saklayan ve yöneten bir API backend'i oluşturma.

Bu konuda, Konu 22'de geçici bir liste kullanan API'mizi, Konu 21'deki Flask-SQLAlchemy entegrasyonunu kullanarak gerçek bir veritabanına bağlayacağız. API endpoint'lerimiz aracılığıyla veritabanında CRUD (Ekleme, Okuma, Güncelleme, Silme) işlemlerini nasıl yapacağımızı öğreneceğiz.

Artık API istekleri geçici listeleri değil, veritabanındaki kalıcı veriyi işleyecek.

Ön Gereksinim:
  • Python, Flask, Flask-SQLAlchemy kurulu olmalı.
  • Konu 21'deki gibi bir veritabanı (örneğin SQLite) ve bir model tanımlanmış olmalı.
  • Konu 22'deki temel API mantığı anlaşılmış olmalı.
  • API endpoint'lerini test etmek için curl, Postman veya Insomnia gibi bir araç kurulu olmalı.

1. Flask Uygulaması ve Model Kurulumu (Konu 21 Tekrarı)

API'mizi veritabanına bağlamak için, Konu 21'deki Flask-SQLAlchemy kurulumu ve model tanımını kullanacağız. Örneğimizde, ürünleri yöneten bir API yapacağımız için basit bir `Product` modeli tanımlayalım.

Python:
from flask import Flask, jsonify, request # Gerekli Flask modüllerini içe aktar
from flask_sqlalchemy import SQLAlchemy # SQLAlchemy modülünü içe aktar
import os

# Flask Uygulaması ve Veritabanı Ayarları
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'site.db') # SQLite veritabanı yolu
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # Modifikasyon izlemeyi kapat
db = SQLAlchemy(app) # SQLAlchemy objesini oluştur

# Veritabanı Modeli - Product tablosunu temsil eder
class Product(db.Model):
    id = db.Column(db.Integer, primary_key=True) # Ürün ID'si (Anahtar)
    ad = db.Column(db.String(100), nullable=False) # Ürün Adı
    fiyat = db.Column(db.Float, nullable=False) # Ürün Fiyatı

    # SQLAlchemy objesini JSON'a çevirmeden önce Python dict'e çevirmek için yardımcı metot
    def to_dict(self):
        return {
            'id': self.id,
            'ad': self.ad,
            'fiyat': self.fiyat
        }

    # print ile yazdırmak için (opsiyonel)
    def __repr__(self):
        return f"Product('{self.ad}', {self.fiyat})"

# Veritabanı tablolarını oluşturma (Uygulama bağlamı içinde bir kere çalıştırılır)
with app.app_context():
    db.create_all()
    print("Veritabanı tabloları kontrol edildi/oluşturuldu.")

# !!! Route'lar buraya gelecek !!!

# Uygulama çalıştırma kısmı
if __name__ == '__main__':
    app.run(debug=True)
Açıklama: Yukarıdaki kod, temel Flask uygulamasını, SQLite veritabanı bağlantısını ve bir `Product` modelini tanımlar. `to_dict()` metodu, SQLAlchemy model nesnelerini Flask'ın `jsonify` fonksiyonunun işleyebileceği Python sözlüklerine dönüştürmek için gereklidir. `db.create_all()` kısmı ise model tanımına göre veritabanında tabloyu oluşturur.

2. SQLAlchemy Nesnelerini JSON'a Çevirme (Serialization)[/B]

Flask'ın `jsonify()` fonksiyonu standart Python tiplerini (sözlükler, listeler, sayılar, stringler vb.) JSON'a çevirebilir. Ancak veritabanından çektiğimiz SQLAlchemy model nesneleri doğrudan çevrilemez. Bu yüzden, model sınıfımıza eklediğimiz `to_dict()` metodu gibi bir yöntemle, nesnenin özelliklerini bir Python sözlüğüne dönüştürmemiz gerekir.

Python:
# Product modelinin içindeki to_dict metodu:
# def to_dict(self):
#     return {
#         'id': self.id,
#         'ad': self.ad,
#         'fiyat': self.fiyat
#     }

# Kullanımı:
# product_obj = Product.query.get(1) # DB'den Product nesnesini çek
# product_dict = product_obj.to_dict() # Nesneyi sözlüğe çevir
# return jsonify(product_dict) # Sözlüğü JSON olarak döndür

3. API Endpointlerini Veritabanı ile Güncelleme (CRUD Operasyonları)[/B]

Şimdi Konu 22'deki geçici liste kullanan API endpoint'lerimizi, SQLAlchemy ORM kullanarak veritabanı ile etkileşime geçecek şekilde güncelleyelim.

Python:
# Önceki Flask, SQLAlchemy, Product model tanımlamaları ve db.create_all() buraya gelecek

# !!! Route'lar başlıyor !!!

# Tüm ürünleri listeleme (Read All) - GET /products
@app.route('/products', methods=['GET'])
def get_products():
    products = Product.query.all() # Veritabanından tüm Product nesnelerini çek

    # Nesne listesini JSON formatına çevirmek için sözlük listesine dönüştür
    # Her product objesi için to_dict() metodunu çağırıp bir liste oluştur
    products_list = [product.to_dict() for product in products]

    return jsonify(products_list) # Sözlük listesini JSON olarak döndür

# Belirli bir ürünü ID'ye göre getirme (Read One) - GET /products/<id>
@app.route('/products/<int:product_id>', methods=['GET'])
def get_product(product_id):
    # ID'ye göre ürünü veritabanından çek, bulunamazsa 404 hatası döndür
    product = Product.query.get_or_404(product_id)

    return jsonify(product.to_dict()) # Bulunan ürünü JSON olarak döndür

# Yeni ürün ekleme (Create) - POST /products
@app.route('/products', methods=['POST'])
def create_product():
    data = request.get_json() # İstekten JSON veriyi al

    # Gelen verinin geçerliliğini kontrol et (Basit kontrol)
    if not data or not 'ad' in data or not 'fiyat' in data:
        return jsonify({'message': 'Geçersiz veri sağlandı (ad veya fiyat eksik)'}), 400 # 400 Bad Request

    # Yeni Product nesnesi oluştur
    new_product = Product(ad=data['ad'], fiyat=data['fiyat'])

    # Nesneyi veritabanına ekle ve kaydet
    db.session.add(new_product)
    db.session.commit() # Veritabanına ekleme burada gerçekleşir

    # Başarı mesajı ve eklenen ürünü 201 status kodu ile döndür
    return jsonify({'message': 'Ürün başarıyla eklendi', 'product': new_product.to_dict()}), 201

# Ürün güncelleme (Update) - PUT /products/<id>
@app.route('/products/<int:product_id>', methods=['PUT'])
def update_product(product_id):
    # Güncellenecek ürünü ID'ye göre veritabanından çek
    product_to_update = Product.query.get_or_404(product_id)

    data = request.get_json() # İstekten JSON veriyi al

    # Gelen veriyi kullanarak ürün özelliklerini güncelle
    # Eğer 'ad' veya 'fiyat' veri içinde varsa güncelle, yoksa mevcut değeri kalsın
    if 'ad' in data:
        product_to_update.ad = data['ad']
    if 'fiyat' in data:
        product_to_update.fiyat = data['fiyat']

    # Değişiklikleri veritabanına kaydet
    db.session.commit()

    # Güncellenmiş ürünü JSON olarak döndür
    return jsonify({'message': 'Ürün başarıyla güncellendi', 'product': product_to_update.to_dict()}) # Varsayılan 200 OK

# Ürün silme (Delete) - DELETE /products/<id>
@app.route('/products/<int:product_id>', methods=['DELETE'])
def delete_product(product_id):
    # Silinecek ürünü ID'ye göre veritabanından çek
    product_to_delete = Product.query.get_or_404(product_id)

    # Ürünü session'dan sil ve veritabanına kaydet
    db.session.delete(product_to_delete)
    db.session.commit()

    # Başarı mesajı döndür
    return jsonify({'message': 'Ürün başarıyla silindi'}) # Varsayılan 200 OK

# !!! Route'lar bitti !!!

# Uygulama çalıştırma kısmı
if __name__ == '__main__':
    app.run(debug=True) # debug=True geliştirme için iyidir
Açıklama: Yukarıdaki kod, Konu 21 ve 22'deki bilgileri birleştirir. Her API endpoint'i (view fonksiyonu) artık veritabanıyla ORM (`Product.query`, `db.session`) aracılığıyla etkileşim kurar. `to_dict()` metodu veritabanından çekilen nesnelerin API yanıtı olarak JSON'a çevrilebilmesini sağlar. PUT ve DELETE metotları da bu örnekte eklenmiştir.

Sıra Sizde![/B]

Artık gerçek bir veritabanıyla çalışan bir API backend'i oluşturma bilgisine sahipsiniz!

  • Yukarıdaki kodun tamamını kendi Flask projenizde (Konu 21/22'deki projeniz üzerine ekleyerek veya yeni bir projede) uygulayın.
  • Veritabanı tablolarının oluştuğundan emin olun (`site.db` dosyasının oluştuğunu ve içinde 'product' tablosunun olduğunu kontrol edin, phpMyAdmin gibi araçlarla bakabilirsiniz).
  • Postman/Insomnia veya curl kullanarak API endpoint'lerini test edin:
    • `GET
      Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
      ` (Boş liste dönmeli veya ekledikleriniz görünmeli)
    • `POST
      Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
      ` (Body'ye JSON data ekleyerek yeni ürün ekleyin: `{"ad": "Kitap", "fiyat": 50}`)
    • Tekrar `GET
      Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
      ` (Yeni eklediğiniz ürün listede görünmeli)
    • Eklediğiniz ürünün ID'sini alarak `GET
      Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
      ` ile o ürünü tek başına çekin.
    • `PUT
      Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
      ` (Body'ye JSON data ekleyerek ürünü güncelleyin: `{"fiyat": 60}`)
    • `DELETE
      Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
      ` ile ürünü silin.
    • Tekrar `GET
      Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
      ` (Silinen ürün listede görünmemeli)
  • Uygulamayı durdurup tekrar çalıştırın ve `GET /products` yaparak verilerin kalıcı olduğunu doğrulayın.
  • API endpoint'lerini veritabanı operasyonlarıyla bağlama mantığı, SQLAlchemy metotlarının API içinde kullanımı veya veri serileştirme (`to_dict()`) hakkında aklınıza takılan soruları çekinmeden bu konu altında sorabilirsiniz.

Serinin Geleceği?[/B]

Flask API'sini veritabanına bağlayarak (CRUD işlemleri ile) temel bir backend API oluşturduk. Bu, web geliştirmenin çok önemli bir adımıdır.

Seriyi buradan sonra nasıl devam ettirelim?

  • API Güvenliği Temelleri (Kimlik Doğrulama - Authentication, Yetkilendirme - Authorization)?
  • Flask ile daha ileri konular (WTForms, Blueprint'ler, Flask-RESTful/RESTX gibi API uzantıları)?
  • Client-side JavaScript kullanarak bu API'yi tüketme (Fetch API, AJAX)?
  • Daha ileri Veri Yapıları ve Algoritma konuları (Bağlı Listeler, Ağaçlar vb.)?
  • Başka bir programlama diline giriş (C#, C++ gibi)?
  • Mobil geliştirme temelleri (API tüketimi dahil)?
  • Veya başka önerileriniz mi var?
Geri bildirimleriniz ve önerileriniz serinin geleceğini şekillendirecektir.

Umarım bu konu, web API'lerini veritabanlarıyla entegre etme konusunda sizlere pratik bir bakış açısı sunmuştur. Görüşmek üzere!



Bu konu, "Hazır Kod Bankası" serisinin yirmi üçüncü parçasıdır ve "Yazılım Bilgi ve Yeni Başlayanlar İçin" kategorisi altında paylaşılmıştır.
 

Şu an konuyu görüntüleyenler

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz

Zevkini yansıtan rengi seç

Geniş / Dar görünüm

Temanızı geniş yada dar olarak kullanmak için kullanabileceğiniz bir yapıyı kontrolünü sağlayabilirsiniz.

Izgara görünümlü forum listesi

Forum listesindeki düzeni ızgara yada sıradan listeleme tarzındaki yapının kontrolünü sağlayabilirsiniz.

Resimli ızgara modu

Izgara forum listesinde resimleri açıp/kapatabileceğiniz yapının kontrolünü sağlayabilirsiniz.

Kenar çubuğunu kapat

Kenar çubuğunu kapatarak forumdaki kalabalık görünümde kurtulabilirsiniz.

Sabit kenar çubuğu

Kenar çubuğunu sabitleyerek daha kullanışlı ve erişiminizi kolaylaştırabilirsiniz.

Köşe kıvrımlarını kapat

Blokların köşelerinde bulunan kıvrımları kapatıp/açarak zevkinize göre kullanabilirsiniz.

Geri