Python
March 31, 2020

Python Flask ile Api Oluşturma

🕊 Bu döküman @KekikAkademi için oluşturulmuştur. ✌🏼

RESTful API - Python Flask

API Nedir?

REST API, geliştiricilerin HTTP/HTTPS protokolünü kullanarak GET - POST - PUT - DELETE gibi isteklerde bulunup, bu isteklere çeşitli formatlarda yanıt aldığı, sistemlerin birbirleriyle iletişim kurmasını kolaylaştıran mimaridir.

REST’in tüm prensiplerini yerine getiren API’ler ise RESTful olarak nitelendirilir.

HTTP protokolünü kullanıyor olması nedeniyle REST API’i pratik olarak herhangi bir programlama dilinde kullanabilir. REST API’yi yazılımlarınızda kullanarak yazılımınızın uzun ömürlü olmasını sağlayabilir ve gelişimini pozitif yönde destekleyebilirsiniz.

REST ile aktarılan veriler HTML, JSON, XML veya farklı bir formata sahip olabilir.
Diğer katı kurallı ve dediğim dedik API’lerin aksine REST, geliştiriciler için bu konuya bir kısıtlama getirmiyor. Ancak biz, en işlevsel olan .json formunu kullanacağız..

REST mimarisinde istemci veri almak veya değiştirmek için sunucuya istekte bulunur.
Bu isteği gerçekleştirirken;

  • ne tür bir işlem yapacağımızı (veri ekleme,silme gibi.),
  • istemci ve sunucunun istek veya yanıtla birlikte ek bilgiler iletebilmesini sağlayan
    HTTP Başlığı(HTTP Header),
  • kaynak(resource)

belirtmemiz gerekir.

HTTP Methodları

HTTP Metodları

Bir REST sisteminde istekte bulunurken kullandığımız 4 temel HTTP Methodu bulunmaktadır:

  • GET — belirli bir kaynaktan veri alır
  • POST — belirli bir kaynaktağa veri yazar
  • PUT — belirli bir kaynağı günceller
  • DELETE — belirli bir kaynaktan veri siler.

Kod Vakti !

  • Flask kütüphanesini yükleyerek başlayalım;
pip install flask
from flask import Flask, jsonify
from flask import make_response
from flask import request

app = Flask(__name__)

#
# Çokomelli İşler
#

if __name__ == '__main__':
    app.config['JSON_AS_ASCII'] = False
    app.run(debug=True, host='0.0.0.0', port=5000)
  1. Kullanacağımız kütüphaneleri içe aktardık,
  2. app adında bi flask nesnesi oluşturduk
  3. betik başladığı zaman app nesnesini
    1. Json Çıktısını ASCII olarak gösterme dedik(karakter hatası almamak için)
    2. debug modu aktif, host olarak tüm bağlantılar, port olarak 5000. portta başlat dedik.

Henüz bu hali bizim hiç bir işimize yaramaz.

Hadi bir GET isteğine cevap vermesi için kodlayalım şu betiği;

from flask import Flask, jsonify
from flask import make_response
from flask import request

app = Flask(__name__)

####### Çokomelli İşler #######

kullanicilar = [
    {'id': 1000,'kullanici_adi': 'keyiflerolsun','mahalle': 'KekikAkademi','rutbe': 'root'},
    {'id': 1001,'kullanici_adi': 'raifpy','mahalle': 'KekikSiber','rutbe': 'python'},
    {'id': 1002,'kullanici_adi': 'ykslkrkci','mahalle': 'KekikSiber','rutbe': 'hain'},
    {'id': 1003,'kullanici_adi': 'Kullanici_bot','mahalle': 'KekikSiber','rutbe': 'BOT'},
]

@app.route('/kekik/api/kullanicilar', methods=['GET'])
def get():
    return jsonify({'Kullanıcı Listesi': kullanicilar})

####### Çokomelli İşler #######

if __name__ == '__main__':
    app.config['JSON_AS_ASCII'] = False
    app.run(debug=True, host='0.0.0.0', port=5000)
  • Taslağımızın içine çokomelli işler ekledik
  1. kullanicilar adında bir tablo oluşturduk ve içerisine 4 kullanıcı kaydı girdik.
  2. app nesnemizi belirlediğimiz yolda GET olarak döndürdük
  3. get adında bir fonksiyon oluşturduk ve jsonify olarak istediğimiz bir başlıkta kullanicilar tablosunu çağırdık.

GET metodunu hallettik. Artık listenin tamamını döndürebiliyoruz.

Peki diğer methotlar?

@app.route('/kekik/api/kullanicilar', methods=['POST'])
def post():
    yeniKullanici = {
        'id': kullanicilar[-1]['id'] + 1,
        'kullanici_adi': request.json['kullanici_adi'],
        'mahalle': request.json['mahalle'],
        'rutbe': request.json['rutbe'],
    }
    kullanicilar.append(yeniKullanici)
    return jsonify({'kullanici': yeniKullanici}), 201
  1. app nesnemizi belirlediğimiz yolda POST olarak döndürdük
  2. post adında bir fonksiyon oluşturduk.
  3. yeniKullanici adında bir sözlük oluşturduk.
    1. id olarak : son kullanıcının id'sine +1 ekledik
    2. kullanici_adi olarak : gelen istekteki kullanici_adi bilgisini aldık
    3. mahalle olarak : gelen istekteki mahalle bilgisini aldık
    4. rutbe olarak : gelen istekteki rutbe bilgisini aldık
  4. kullanıcılar listesine yeniKullanici sözlüğümüzü ekledik
  5. jsonify olarak eklediğimiz yeniKullanici sözlüğümüzü çevirdik, 201 yanıtıyla
201 – Created : Yeni kaynağın yaratıldığının bilgisi anlamına gelmektedir.

Pekiiiii eğer kullanıcı bizim tanımlamadığımız başka bir yola giderse? Şuan için Not Found Ekranı veriyor. Bunu değiştirebilir miyiz?

Tabiki..!

Not-Found Ekranımızı Ekleyelim bakalım;

@app.errorhandler(404)
def not_found(error):
    return make_response(
        jsonify({'HTTP 404 Error': 'Aradığınız içerik mevcut değil. Lütfen isteğinizi kontrol edin.'}), 404
    )
  1. app nesnemize errorhandler ekledik ve 404 olduğu hali tanımladık.
  2. fonksiyonumuzu oluşturup jsonify şeklinde hatamızı çevirdik.

Şu ana kadar neler yaptık?

  1. API çalışacağı ip ve port bilgisi tanımlayıp ascii gösterimini iptal ettik.
  2. GET metoduyla kullanıcıya cevap verecek,
    POST metoduyla yeni veri girilebilecek bir hale getirdik.
  3. 404 sayfaları için özel jsonify ekranı ekledik.

neyimiz eksik?

Hadi Bitirelim Şu İşi;

@app.route('/kekik/api/kullanicilar/<int:kullanici_id>', methods=['GET'])
def get_kullanici(kullanici_id):
    kullanici = [kullanici for kullanici in kullanicilar if kullanici['id'] == kullanici_id]
    if len(kullanici) == 0:
        return jsonify({'Kullanıcı': 'Bulunamadı'}), 404
    return jsonify({'Kullanıcı': kullanici})
@app.route('/kekik/api/kullanicilar/<int:kullanici_id>', methods=['DELETE'])
def delete_kullanici(kullanici_id):
    kullanici = [kullanici for kullanici in kullanicilar if kullanici['id'] == kullanici_id]
    if len(kullanici) == 0:
        return jsonify({'Kullanıcı': 'Bulunamadı'}), 404
    kullanicilar.remove(kullanici[0])
    return jsonify({'Kullanıcı Silindi': kullanici})

BU Betiğin Tamamı <<

RESTful Versiyonu <<

Sevgilerimle,
@keyiflerolsun

________________________________________________

📃 Yandex.Disk Bünyemizdeki veriler 1TB'a Ulaşmıştır.. 🎊

Paylaşılan Kursların Tümünü @KekikKahve Grubu notlarından Çağırabilirsiniz..

🕊️ Bize oy verip paylaşarak destek olmaya ne dersin? ✌🏼