Flask + GridFs + Mongodb ile Basit REST API Nasıl Yapılır

Özellikle yapacağım basit işler için her zaman micro framework olarak Flask tercih ettim, bu örneği de arkadaşıma yardım ederken hazırladım. Ufak tefek işler için değiştirip ekleme yapıp falan kullanabilirsiniz.

Python’un öğrenmesi kolay ancak API servis mantığı, Mongodb yapısı ve GridFs kullanımlarını öğrenmek biraz zaman alabiliyor. Bu konulara ayrıca odaklanmanızı şiddetle öneririm

Kullandığımız bileşenlerin sıralı tam listesi ise şu şekilde

pip install pymongo
pip install flask-restful
pip install flask

Öncelikli olarak Mongodb için gereken bileşenleri kodumuza ekleyerek başlıyoruz. Bu bizim veritabanımıza bağlanırken kullanacağımız dizgemiz. Kullanılacak veritabanı adını da ayrıca db olarak belirtiyoruz. Ben bunun için data demeyi tercih ettim.

from pymongo import MongoClient

client = MongoClient('mongodb://127.0.0.1:27017')
db = client['data']

Ardından o dizinde dosya ve klasör işlemleriniz yapabileceğimizi düşündüğüm için BASE_DIR tanımlaması yaptım. Bu şekilde çalıştığımız proje klasörünü dikkate aldık ama gerekmediği için kullanmayı tercih etmedim. Ancak projelerimizde olması önemli

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

Aynı form yapısında olduğu gibi verilerin bir şekilde arka tarafa erişmesi gerekiyor, bu noktada argument olarak gereken tanımlamaları mı reqparse ile projeme tanımladım.

parser = reqparse.RequestParser()
parser.add_argument('Name')
parser.add_argument('Latitude')
parser.add_argument('Longitude')
parser.add_argument('Comments')

Ardından tanımladığım bu 4 adet bilgimin arka tarafa ulaşması durumunda ne yapmam gerektiğini belirledim.

class ApiData(Resource):
    # Get isteği ile işimiz yok
    def get(self):
        return 'Ok'
    
    # Post isteğimizi düzenliyoruz.
    def post(self):
        # Verimiz json olacak
        data = request.get_json()
        # json mu yoksa değilmi diye kontrol ediyoruz. Eğer değilse hata basacağız.
        if not data:
            data = {"response": "ERROR"}
            return jsonify(data)
        else:
            # Json formatındaki verimizi argüman olarak parçalıyoruz.
            form_datum = parser.parse_args()
            # Veri var mı yok mu diye kontrol ediyoruz.
            if form_datum:
                # Veritabanımıza kayıt ediyoruz.
                db.android.insert_one(form_datum)
            else:
                # Aksi durumda hata basıyoruz.
                return {"response": "missing data"}

Görselleri aldığımda ne yapmam gerektiğine karar vermem gerekiyordu ben bu noktada görselleri direk GridFs üzerine atmayı seçtim depolama maliyetleri artık günümüzde düşük, ayrıca fazla bir şey de tutmayacağız zaten.

class ImageData(Resource):
    # Post isteğmiz
    def post(self):
        # Görselimizi api üzerinden alıyoruz
        image_file = request.files['Images']
        # Eğer dosya varsa aksiyona giriyoruz
        if image_file:
            # GridFs üzerine atıyoruz.
            fs.put(image_file)

Kodumuz yavaş yavaş tamamlanıyor şimdi ise sıra bağlantıları belirlemeye geldi, bu aşamada /api ve /api/images olarak 2 endpoint belirledim. Bunlar üzerinden geliştirmekte olduğum uygulamamı kolay bir şekilde test edebileceğim.

# API'ye direk ulaşılırsa bir şeyler görmek için yönlendirmemizi yapıyoruz.
class Index(Resource):
    def get(self):
        return redirect(url_for("android"))

# RESTFUL Api Oluşturuyoruz
api = Api(app)
# Index belirliyoruz.
api.add_resource(Index, "/", endpoint="index")
# Yönlendirilecek API endpointimizi belirliyoruz
api.add_resource(ApiData, "/api", endpoint="android")
# Yönlendirilecek ikinci API endpointimizi belirliyoruz.
api.add_resource(ImageData, "/api/images", endpoint="images")

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

Kodumuzun tamamı

from flask import Flask, jsonify, request, redirect, url_for
from flask_restful import reqparse, Api, Resource
from pymongo import MongoClient
import gridfs
import os

client = MongoClient('mongodb://127.0.0.1:27017')
app = Flask(__name__)
db = client['data']
fs = gridfs.GridFS(db)

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

parser = reqparse.RequestParser()
parser.add_argument('Name')
parser.add_argument('Latitude')
parser.add_argument('Longitude')
parser.add_argument('Comments')


class ApiData(Resource):
    def get(self):
        return 'Ok'

    def post(self):
        data = request.get_json()
        if not data:
            data = {"response": "ERROR"}
            return jsonify(data)
        else:
            form_datum = parser.parse_args()
            if form_datum:
                db.android.insert_one(form_datum)
            else:
                return {"response": "missing data"}

class ImageData(Resource):
    def post(self):
        image_file = request.files['Images']
        if image_file:
            fs.put(image_file)


class Index(Resource):
    def get(self):
        return redirect(url_for("android"))


api = Api(app)
api.add_resource(Index, "/", endpoint="index")
api.add_resource(ApiData, "/api", endpoint="android")
api.add_resource(ImageData, "/api/images", endpoint="images")

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

İşlemimiz böylelikle son buldu, uygulamamızı geliştirirken kullanacağımız geçici apimizi güle güle kullanabiliriz. Kodda iyileştirme yapmadan prod’da kullanmayınız. Testler için kullanabilirsiniz.

Sistem Uzmanı, Linux Hacısı, El-Kernel

“Flask + GridFs + Mongodb ile Basit REST API Nasıl Yapılır” üzerine 2 yorum

  1. Bizler Şehirler arası Nakliyat Yapanlar bir firmayız. Bu şekilde güzel paylaşımlarınız için çok teşekkür ediyoruz. Elinize emeğinize sağlık. Uğraş vererek güzel makale yazmışsınız. Bilgileriniz için teşekkür ederiz.

    Yanıtla

Yorum yapın