Python Flask ile Api Oluşturma
🕊 Bu döküman @KekikAkademi için oluşturulmuştur. ✌🏼
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ı
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
- Ardından çıplak bir şekilde taslağımıza bakalım;
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)
- Kullanacağımız kütüphaneleri içe aktardık,
app
adında bi flask nesnesi oluşturduk- betik başladığı zaman app nesnesini
- Json Çıktısını ASCII olarak gösterme dedik(karakter hatası almamak için)
- 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
kullanicilar
adında bir tablo oluşturduk ve içerisine 4 kullanıcı kaydı girdik.app
nesnemizi belirlediğimiz yolda GET olarak döndürdükget
adında bir fonksiyon oluşturduk ve jsonify olarak istediğimiz bir başlıktakullanicilar
tablosunu çağırdık.
GET metodunu hallettik. Artık listenin tamamını döndürebiliyoruz.
Peki diğer methotlar?
- POST Methodu'na bakalım;
@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
app
nesnemizi belirlediğimiz yolda POST olarak döndürdükpost
adında bir fonksiyon oluşturduk.yeniKullanici
adında bir sözlük oluşturduk.- id olarak : son kullanıcının id'sine +1 ekledik
- kullanici_adi olarak : gelen istekteki kullanici_adi bilgisini aldık
- mahalle olarak : gelen istekteki mahalle bilgisini aldık
- rutbe olarak : gelen istekteki rutbe bilgisini aldık
kullanıcılar
listesineyeniKullanici
sözlüğümüzü ekledik- 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 )
app
nesnemize errorhandler ekledik ve 404 olduğu hali tanımladık.- fonksiyonumuzu oluşturup jsonify şeklinde hatamızı çevirdik.
Şu ana kadar neler yaptık?
- API çalışacağı ip ve port bilgisi tanımlayıp ascii gösterimini iptal ettik.
- GET metoduyla kullanıcıya cevap verecek,
POST metoduyla yeni veri girilebilecek bir hale getirdik. - 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? ✌🏼