API írása Pythonban (Flask és RapidAPI segítségével)
Ha ezt a cikket olvassa, valószínűleg már ismeri az API (Application Programming Interface) használatából adódó lehetőségeket.
Ha a számos nyitott API egyikét hozzáadja az alkalmazáshoz, bővítheti az alkalmazás funkcionalitását, vagy gazdagíthatja a szükséges adatokkal. De mi van, ha kifejlesztett egy egyedi funkciót, amelyet meg szeretne osztani a közösséggel?
A válasz egyszerű: kell hozzon létre saját API-t.
Bár ez elsőre nehéz feladatnak tűnhet, valójában egyszerű. Megmutatjuk, hogyan kell ezt megtenni Python használatával.
Amire szüksége van az induláshoz
API fejlesztéséhez a következőkre van szüksége:
Python 3;
Palack — egyszerű és könnyen használható keretrendszer webes alkalmazások létrehozásához;
Lombik-pihenő a Flask kiterjesztés, amely lehetővé teszi a REST API gyors és minimális konfigurációval történő fejlesztését.
A telepítés a következő paranccsal történik:
pip install flask-restful
Kezdőknek ajánlunk egy ingyenes intenzív programozási tanfolyamot: Telegram bot fejlesztés C#-ban – augusztus 26–28. Ingyenes intenzív tanfolyam, amely lehetővé teszi, hogy megértse az asszisztens robotok működését, a Telegram API-val való munka sajátosságait és más árnyalatokat. A három legjobb résztvevő 30 000 rubelt kap a Skillboxtól.
Mielőtt elkezded
Egy RESTful API-t fogunk fejleszteni az alapszinttel CRUID funkció.
A feladat teljes megértéséhez értsük meg a fent említett két kifejezést.
Mi az a REST?
A REST API (Representational State Transfer) egy olyan API, amely HTTP kéréseket használ az adatcseréhez.
A REST API-knak meg kell felelniük bizonyos feltételeknek:
Kliens-szerver architektúra: A kliens a felhasználói felülettel, a kiszolgáló pedig a háttérrel és az adattárolóval kommunikál. A kliens és a szerver független, bármelyikük külön cserélhető a másiktól.
Állapot nélküli – a szerveren nem tárolódnak kliensadatok. A munkamenet állapota a kliens oldalon tárolódik.
Gyorsítótárazhatóság – Az ügyfelek gyorsítótárba helyezhetik a szerver válaszait az általános teljesítmény javítása érdekében.
Mi az a CRUD?
szifilisz egy programozási koncepció, amely négy alapvető műveletet ír le (létrehozás, olvasás, frissítés és törlés).
A REST API-ban a kéréstípusok és a kérési metódusok felelősek az olyan műveletekért, mint a közzététel, beszerzés, elhelyezés, törlés.
Most, hogy megértettük az alapvető feltételeket, megkezdhetjük az API létrehozását.
tervezés
Hozzuk létre a mesterséges intelligenciáról szóló idézetek tárházát. Az AI napjaink egyik leggyorsabban fejlődő technológiája, a Python pedig népszerű eszköz az AI-val való munkavégzéshez.
Ezzel az API-val a Python fejlesztők gyorsan információhoz juthatnak az AI-ról, és inspirációt kaphatnak az új fejlesztésekből. Ha egy fejlesztőnek vannak értékes gondolatai ebben a témában, felveheti azokat az adattárba.
Kezdjük a szükséges modulok importálásával és a Flask beállításával:
from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)
Ebben a részletben a Flask, az Api és az Erőforrás a szükséges osztályok.
A Reqparse egy Flask-RESTful lekérdezéselemző felület... Szüksége lesz egy véletlenszerű modulra is, hogy véletlenszerű idézetet jelenítsen meg.
Most létrehozzuk az AI-ról szóló idézetek tárházát.
Minden repo bejegyzés a következőket tartalmazza:
digitális azonosító;
az idézet szerzőjének neve;
idézet.
Mivel ez csak egy gyakorlati példa, az összes bejegyzést egy Python-listában fogjuk tárolni. Valós alkalmazásban valószínűleg adatbázist használnánk helyette.
ai_quotes = [
{
"id": 0,
"author": "Kevin Kelly",
"quote": "The business plans of the next 10,000 startups are easy to forecast: " +
"Take X and add AI."
},
{
"id": 1,
"author": "Stephen Hawking",
"quote": "The development of full artificial intelligence could " +
"spell the end of the human race… " +
"It would take off on its own, and re-design " +
"itself at an ever increasing rate. " +
"Humans, who are limited by slow biological evolution, " +
"couldn't compete, and would be superseded."
},
{
"id": 2,
"author": "Claude Shannon",
"quote": "I visualize a time when we will be to robots what " +
"dogs are to humans, " +
"and I’m rooting for the machines."
},
{
"id": 3,
"author": "Elon Musk",
"quote": "The pace of progress in artificial intelligence " +
"(I’m not referring to narrow AI) " +
"is incredibly fast. Unless you have direct " +
"exposure to groups like Deepmind, " +
"you have no idea how fast — it is growing " +
"at a pace close to exponential. " +
"The risk of something seriously dangerous " +
"happening is in the five-year timeframe." +
"10 years at most."
},
{
"id": 4,
"author": "Geoffrey Hinton",
"quote": "I have always been convinced that the only way " +
"to get artificial intelligence to work " +
"is to do the computation in a way similar to the human brain. " +
"That is the goal I have been pursuing. We are making progress, " +
"though we still have lots to learn about " +
"how the brain actually works."
},
{
"id": 5,
"author": "Pedro Domingos",
"quote": "People worry that computers will " +
"get too smart and take over the world, " +
"but the real problem is that they're too stupid " +
"and they've already taken over the world."
},
{
"id": 6,
"author": "Alan Turing",
"quote": "It seems probable that once the machine thinking " +
"method had started, it would not take long " +
"to outstrip our feeble powers… " +
"They would be able to converse " +
"with each other to sharpen their wits. " +
"At some stage therefore, we should " +
"have to expect the machines to take control."
},
{
"id": 7,
"author": "Ray Kurzweil",
"quote": "Artificial intelligence will reach " +
"human levels by around 2029. " +
"Follow that out further to, say, 2045, " +
"we will have multiplied the intelligence, " +
"the human biological machine intelligence " +
"of our civilization a billion-fold."
},
{
"id": 8,
"author": "Sebastian Thrun",
"quote": "Nobody phrases it this way, but I think " +
"that artificial intelligence " +
"is almost a humanities discipline. It's really an attempt " +
"to understand human intelligence and human cognition."
},
{
"id": 9,
"author": "Andrew Ng",
"quote": "We're making this analogy that AI is the new electricity." +
"Electricity transformed industries: agriculture, " +
"transportation, communication, manufacturing."
}
]
Most létre kell hoznunk egy Quote erőforrásosztályt, amely meghatározza API-végpontjaink műveleteit. Az osztályon belül négy metódust kell deklarálnod: get, post, put, delete.
Kezdjük a GET módszerrel
Lehetővé teszi, hogy konkrét árajánlatot kapjunk az azonosító megadásával, vagy véletlenszerű árajánlatot, ha az azonosító nincs megadva.
class Quote(Resource):
def get(self, id=0):
if id == 0:
return random.choice(ai_quotes), 200
for quote in ai_quotes:
if(quote["id"] == id):
return quote, 200
return "Quote not found", 404
A GET metódus véletlenszerű idézetet ad vissza, ha az azonosító tartalmazza az alapértelmezett értéket, pl. a metódus hívásakor nem volt megadva azonosító.
Ha meg van adva, akkor a metódus az idézetek között keres, és megkeresi azt, amelyik tartalmazza a megadott azonosítót. Ha nem talál semmit, az „Idézet nem található, 404” üzenet jelenik meg.
Ne feledje: a metódus 200 HTTP-állapotot ad vissza, ha a kérés sikeres volt, és 404-et, ha a rekord nem található.
Most hozzunk létre egy POST metódust új idézet hozzáadásához a tárhoz
Gépelés közben minden új ajánlat azonosítóját megkapja. Ezenkívül a POST a reqparse segítségével elemzi a kérés törzsébe kerülő paramétereket (szerző és idézet szövege).
def post(self, id):
parser = reqparse.RequestParser()
parser.add_argument("author")
parser.add_argument("quote")
params = parser.parse_args()
for quote in ai_quotes:
if(id == quote["id"]):
return f"Quote with id {id} already exists", 400
quote = {
"id": int(id),
"author": params["author"],
"quote": params["quote"]
}
ai_quotes.append(quote)
return quote, 201
A fenti kódban a POST metódus elfogadta az ajánlatazonosítót. Ezután a reqparse segítségével lekérte a szerzőt és az idézetet a lekérdezésből, és eltárolta őket a params szótárban.
Ha a megadott azonosítóval már létezik árajánlat, a metódus egy megfelelő üzenetet és 400-as kódot jelenít meg.
Ha a megadott azonosítójú hivatkozás még nem jött létre, a metódus új rekordot hoz létre a megadott azonosítóval és szerzővel, valamint egyéb paraméterekkel. Ezután hozzáadja a bejegyzést az ai_quotes listához, és visszaadja a bejegyzést az új idézettel együtt egy 201-es kóddal.
Most létrehozunk egy PUT metódust a tárolóban meglévő idézet megváltoztatásához
A PUT metódus az előző példához hasonlóan ID-t és bemenetet vesz fel, és a reqparse segítségével elemzi az idézet paramétereit.
Ha létezik hivatkozás a megadott azonosítóval, a metódus frissíti azt az új paraméterekkel, majd a frissített idézetet 200-as kóddal adja ki. Ha még nincs megadott azonosítójú hivatkozás, akkor egy új rekord jön létre 201 kóddal.
Végül hozzunk létre egy DELETE metódust a már nem inspiráló idézet eltávolításához
def delete(self, id):
global ai_quotes
ai_quotes = [qoute for qoute in ai_quotes if qoute["id"] != id]
return f"Quote with id {id} is deleted.", 200
Ez a metódus bemenetként megkapja az idézetazonosítót, és a megosztott lista használatával frissíti az ai_quotes listát.
Most, hogy elkészítettük az összes metódust, mindössze annyit kell tennünk, hogy egyszerűen adjunk hozzá egy erőforrást az API-hoz, állítsuk be az elérési utat, és futtassuk a Flask-ot.
api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
app.run(debug=True)
REST API szolgáltatásunk készen áll!
Ezután a kódot az app.py fájlba menthetjük úgy, hogy a konzolon a következő paranccsal futtatjuk:
python3 app.py
Ha minden jó, akkor valami ilyesmit kapunk:
* Hibakeresési mód: be
*Fuss tovább 127.0.0.1:5000/ (A kilépéshez nyomja le a CTRL+C billentyűkombinációt)
* Újraindítás stat
* A hibakereső aktív!
* Hibakereső PIN: XXXXXXX
Az API tesztelése
Az API létrehozása után tesztelni kell.
Ezt megteheti a curl console segédprogrammal vagy az Insomnia REST klienssel, vagy az API közzétételével a Rapid API-n.
API-nk közzététele
A RapidAPI a világ legnagyobb piaca több mint 10 000 API-val (és körülbelül 1 millió fejlesztővel).
A RapidAPI nemcsak egyetlen felületet biztosít a harmadik féltől származó API-kkal való munkavégzéshez, hanem lehetővé teszi saját API gyors és egyszerű közzétételét is.
Ahhoz, hogy csináld, először közzé kell tennie a hálózat valamelyik szerverén. A mi esetünkben használni fogjuk Heroku. A vele való munka nem okozhat nehézséget, (itt tudhat meg többet róla).
Az API közzététele a Heroku-n
1. Telepítse a Heroku-t.
Az első lépés a Heroku Command Line Interface (CLI) regisztrálása és telepítése. Ez Ubuntu 16+-on működik.
sudo snap install heroku —klasszikus
Akkor jelentkezz be:
heroku bejelentkezés
2. Adja hozzá a szükséges fájlokat.
Most hozzá kell adnunk a közzétenni kívánt fájlokat egy mappához az alkalmazásunkban:
követelmények.txt a szükséges Python-modulok listájával;
Profil, amely megadja, hogy milyen parancsokat kell végrehajtani az alkalmazás futtatásához;
.gitignore – a kiszolgálón nem szükséges fájlok kizárása.
A követelmények.txt fájl a következő sorokat tartalmazza:
kulacs
lombik-pihenő
puskaszarvú
Kérjük, vegye figyelembe, hogy felvettük a listára a gunicorn (Python WSGI HTTP Server) alkalmazást, mert alkalmazásunkat a szerveren kell futtatnunk.
A profil a következőket tartalmazza:
web: gunicorn app:app
A .gitignore tartalma:
*.pyc
__pycache__/
Most, hogy a fájlok létrejöttek, inicializáljuk a git repót, és véglegesítsük:
git init
git add
git commit -m "First API commit"
3. Hozzon létre egy új Heroku alkalmazást.
heroku create
A fő ágat a távoli Heroku repóhoz toljuk:
git push heroku master
Most már megkezdheti az API szolgáltatás megnyitásával a parancsokat:
Miután API-szolgáltatását közzétették a Heroku-n, hozzáadhatja a Rapid API-hoz. Itt részletes dokumentációt ebben a témában.
1. Hozzon létre egy RapidAPI-fiókot.
Regisztráljon ingyenes fiókot – ezt megteheti a Facebook, Google, GitHub segítségével.
2. Adja hozzá az API-t a vezérlőpulthoz.
3. Ezután adja meg az API általános adatait.
4. Az „API hozzáadása” gombra kattintás után egy új oldal jelenik meg, ahol információkat adhat meg API-nkról.
5. Most vagy manuálisan megadhatja az API-végpontokat, vagy letöltheti swagger-akta OpenAPI használatával.
Nos, most be kell állítanunk az API végpontjait a Végpontok oldalon. Esetünkben a végpontok a CRUD fogalmának felelnek meg (get, post, put, delete).
Ezután létre kell hoznia egy GET AI Quote végpontot, amely egy véletlenszerű idézetet (ha az azonosító alapértelmezett) vagy a megadott azonosítóhoz tartozó idézetet jelenít meg.
Végpont létrehozásához kattintson a „Végpont létrehozása” gombra.
Ezt a folyamatot megismételjük az összes többi API-végpontnál. Ez minden! Gratulálunk, közzétette API-ját!
Ha minden rendben van, az API-oldal valahogy így fog kinézni:
Következtetés
Ebben a cikkben megismertük a saját RESTful API-szolgáltatás létrehozásának folyamatát a Pythonban, valamint az API-nak a Heroku felhőben való közzétételének és a RapidAPI-könyvtárba való hozzáadásának folyamatát.
A tesztverzió azonban csak az API-fejlesztés alapelveit mutatta meg – az olyan árnyalatokat, mint a biztonság, a hibatűrés és a méretezhetőség, nem vették figyelembe.
Valódi API fejlesztésénél mindezt figyelembe kell venni.