- 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)
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
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.
- `POST
Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
- Tekrar `GET
Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
- 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.
- `PUT
Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
- `DELETE
Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
- Tekrar `GET
Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
- `GET
- 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?
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.