Hello everyone I am so proud that I just finished my new api application and publish it on RapidAPI The application is to get calories and joules values in some foods data.
So I want to share my story with building this app with you I hope it will help or make some difference in your learning path.
1-First Step:
I started by searching for data source that I can be use it as database to get information from it in my app so I found a csv file on kaggle contains the data that I need.
...
2-Handling data source file:
Next step was convert the data in the csv file to mongo database so I used pymongo but before I pushed it to the database I created to the system to handling the informations that contains tow main types
Category and Food.
import uuid from abc import ABCMeta, abstractmethod, ABC from database import Database class Model(metaclass=ABCMeta): collection = "model" def __init__(self, _id=''): self._id = _id or uuid.uuid4().hex @abstractmethod def to_json(self): raise NotImplementedError @classmethod def all(cls): return [cls(**item) for item in Database.all(cls.collection)] def save_to_db(self): Database.insert_one(self.collection, self.to_json()) @classmethod def fine_one_by_id(cls, _id): item = Database.find_one_by_id(cls.collection, _id) return cls(**item) @classmethod def fine_one_by_name(cls, name): item = Database.find_one_by_name(cls.collection, name) return cls(**item) @classmethod def delete_one(cls, _id): if cls.fine_one_by_id(_id): Database.delete_one(cls.collection, _id) @classmethod def filter(cls, **kwargs): return [cls(**item) for item in Database.filter(cls.collection, **kwargs)] class Category(Model, ABC): collection = "food_category" def __init__(self, name='', *args, **kwargs): super().__init__(*args, **kwargs) self.name = name pass def to_json(self): return { '_id': self._id, 'name': self.name } class Food(Model, ABC): collection = "food" def __init__(self, name='', per100grams=0, cals_per100grams=0, kj_per100grams=0, category_id='', *args, **kwargs): super().__init__(*args, **kwargs) self.name = name self.per100grams = per100grams self.cals_per100grams = cals_per100grams self.kj_per100grams = kj_per100grams self.category_id = category_id pass def to_json(self): return { '_id': self._id, 'name': self.name, 'per100grams': self.per100grams, 'cals_per100grams': self.cals_per100grams, 'kj_per100grams': self.kj_per100grams, 'category_id': self.category_id }
3-Create database.py file:
I created file to handle database functions it's contains Database class
from pymongo import MongoClient class Database: url = "url_to_mongo_db" client = MongoClient(url) db = client.get_database() @classmethod def insert_one(cls, collection, item): cls.db[collection].insert_one(item) pass @classmethod def find_one_by_id(cls, collection, _id): return cls.db[collection].find_one({'_id': _id}) @classmethod def find_one_by_name(cls, collection, name): return cls.db[collection].find_one({'name': name}) @classmethod def delete_one(cls, collection, _id): cls.db[collection].delete_one({'_id': _id}) @classmethod def all(cls, collection): return cls.db[collection].find({}) @classmethod def filter(cls, collection, **kwargs): return cls.db[collection].find(kwargs)
after it I inserted all data from csv file to mongo database
4-Build api using flask
I used flask to create the app endpoints and tested it by postman software so every end point I created I test it
from flask import Flask, make_response, jsonify from models import Category, Food app = Flask(__name__) @app.route('/') def index(): return 'WELCOME TO FOOD CALORIES API' @app.route('/categories/all') def categories(): all_categories = [category.to_json() for category in Category.all()] return make_response(jsonify(all_categories)) @app.route('/categories/<category_name>') def get_category_by_name(category_name): selected_category = Category.fine_one_by_name(category_name) return make_response(jsonify(selected_category.to_json())) @app.route('/categories/<category_name>/foods') def get_foods_by_category_name(category_name): selected_category = Category.fine_one_by_name(category_name) selected_foods = [food.to_json() for food in Food.filter(category_id=selected_category._id)] return make_response(jsonify({'category': selected_category.to_json(), 'foods': selected_foods})) @app.route('/foods/all') def foods(): all_foods = [food.to_json() for food in Food.all()] return make_response(jsonify(all_foods)) @app.route('/foods/<food_name>') def get_food_by_name(food_name): selected_food = Food.fine_one_by_name(food_name) return make_response(jsonify(selected_food.to_json())) @app.route('/foods/sorted-by-kj') def sort_food_by_kj(): selected_food = [food for food in Food.all()] selected_food.sort(key=lambda food: food.kj_per100grams) sorted_foods = [food.to_json() for food in selected_food] return make_response(jsonify(sorted_foods)) @app.route('/foods/sorted-by-cals') def sort_food_by_cals(): selected_food = [food for food in Food.all()] selected_food.sort(key=lambda food: food.cals_per100grams) sorted_foods = [food.to_json() for food in selected_food] return make_response(jsonify(sorted_foods)) if __name__ == '__main__': app.run(debug=True)
5-Deploy app to heroku platform
after testing app endpoints I started preparing app to deploy it to heroku site first instaled gunicorn package the created requirements.txt by typing pip freeze>requirements.txt
then created app on heroku named it calories-app
and by following steps in heroku documentations finally deployed and has been live.
6-Publish app on RapidAPI:
after creating account on Rapiedapi I created new api app and after some steps I the app is done.
...
You can use it Now on foods-caloris
Please support me on my network links:
patreon
youtube
facebook
instagram
Top comments (0)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.