Ö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.