Python Flask ile REST API Geliştirme (SQLAlchemy ve PostgreSQL ile)

image

12 Jun 2024

Bu yazıda, Flask ile bir REST API geliştirmeyi ve bu API'yi PostgreSQL veritabanı ile entegre etmeyi öğreneceksiniz. SQLAlchemy, Python için popüler bir ORM (Object-Relational Mapping) kütüphanesidir ve veritabanı işlemlerini kolaylaştırır. PostgreSQL ise güçlü ve yaygın olarak kullanılan bir veritabanı yönetim sistemidir. Adım adım ilerleyerek bir örnek uygulama oluşturacağız. 

Gereksinimler

  1. Python 3.x
  2. PostgreSQL
  3. Flask
  4. SQLAlchemy
  5. Flask-Migrate

Kurulum

Öncelikle gerekli Python paketlerini yükleyelim:

pip install Flask SQLAlchemy psycopg2-binary Flask-Migrate

PostgreSQL Veritabanı Kurulumu

PostgreSQL'in kurulu olduğunu varsayıyoruz. Yeni bir veritabanı ve kullanıcı oluşturmak için aşağıdaki komutları kullanabilirsiniz:

CREATE DATABASE flask_api_db;
CREATE USER flask_user WITH PASSWORD 'yourpassword';
GRANT ALL PRIVILEGES ON DATABASE flask_api_db TO flask_user;

Proje Yapısı

Proje dosya yapımız şu şekilde olacak:

flask_api/
    ├── app.py
    ├── models.py
    ├── routes.py
    ├── config.py
    ├── migrations/
    └── __init__.py

Config.py

Veritabanı bağlantı ayarlarımızı config.py dosyasında tutacağız.

import os

class Config:
    SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL', 'postgresql://flask_user:yourpassword@localhost/flask_api_db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False

Models.py

Veritabanı modellerimizi models.py dosyasında tanımlayacağız. Örnek olarak bir User modeli oluşturalım.

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return f'<User {self.username}>'

Routes.py

API rotalarını routes.py dosyasında tanımlayacağız.

from flask import Blueprint, jsonify, request
from models import db, User

api = Blueprint('api', __name__)

@api.route('/users', methods=['GET'])
def get_users():
    users = User.query.all()
    return jsonify([{'id': user.id, 'username': user.username, 'email': user.email} for user in users])

@api.route('/users', methods=['POST'])
def add_user():
    data = request.get_json()
    new_user = User(username=data['username'], email=data['email'])
    db.session.add(new_user)
    db.session.commit()
    return jsonify({'id': new_user.id, 'username': new_user.username, 'email': new_user.email}), 201

init.py

Flask uygulamamızı ve gerekli uzantıları __init__.py dosyasında başlatacağız.

from flask import Flask
from config import Config
from models import db
from routes import api

def create_app():
    app = Flask(__name__)
    app.config.from_object(Config)
    
    db.init_app(app)
    
    app.register_blueprint(api, url_prefix='/api')
    
    return app

App.py

Uygulamamızı çalıştırmak için app.py dosyasını kullanacağız. 

from __init__ import create_app
from flask_migrate import Migrate
from models import db

app = create_app()
migrate = Migrate(app, db)

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

Veritabanı Migrasyonları

Flask-Migrate kullanarak veritabanı migrasyonlarını yönetebiliriz. 

flask db init
flask db migrate -m "Initial migration."
flask db upgrade

Çalıştırma

Son olarak, uygulamayı çalıştırabiliriz. 

python app.py 

 Tarayıcınızda http://127.0.0.1:5000/api/users adresine giderek kullanıcıları listeleyebilir veya POST isteği göndererek yeni kullanıcı ekleyebilirsiniz.

Sonuç

Bu yazıda, Flask kullanarak bir REST API oluşturmayı, SQLAlchemy ile PostgreSQL veritabanına bağlanmayı ve Flask-Migrate ile veritabanı migrasyonlarını yönetmeyi öğrendik. Flask'ın esnek yapısı ve SQLAlchemy'nin güçlü ORM yetenekleri sayesinde kolayca ölçeklenebilir ve yönetilebilir API'ler geliştirebilirsiniz.