API-t írunk Pythonban (Flask és RapidAPI segítségével)

API-t írunk Pythonban (Flask és RapidAPI segítségével)

Ha ezt a cikket olvassa, valószínűleg már ismeri az API (alkalmazásprogramozási interfész) használatával járó lehetőségeket.

Ha a sok nyílt API egyikét hozzáadja az alkalmazásához, kibővítheti az alkalmazás funkcionalitását vagy kiegészítheti azt szükséges adatokkal. De mi van, ha egy egyedi funkciót fejlesztett ki, amelyet szeretne megosztani a közösséggel?

A válasz egyszerű: hozzon létre saját API-t..

Bár ez elsőre bonyolult feladatnak tűnhet, valójában nagyon egyszerű. Elmondjuk, hogyan lehet ezt megtenni Python segítségével.

Mi szükséges a kezdéshez?

API fejlesztéséhez szükséges:

  • Python 3;
  • Flask — egy egyszerű és könnyen használható webalkalmazáskeretrendszer;
  • Flask-RESTful — a Flaskhoz készült kiegészítő, amely lehetővé teszi, hogy gyorsan és minimális beállítással készítsen REST API-t.

A telepítést az alábbi paranccsal végezheti el:

pip install flask-restful

Ajánljuk a kezdők számára ingyenes intenzív programozási kurzust:
C#-on történő telegram-bot fejlesztés — augusztus 26-28. Ingyenes intenzív kurzus, amely segít megérteni, hogyan működnek a segítő botok, a Telegram API-val való munka sajátosságait és egyéb részleteit. A három legjobb résztvevő 30 000 rubelt kap a Skillboxtól..

Mielőtt elkezdenénk

Egy alapvető RESTful API-t fogunk fejleszteni CRUD-funkcionalitással..

Annak érdekében, hogy teljesen megértsük a feladatot, nézzük meg a fenti két kifejezést.

Mi az a REST?

A REST API (Representational State Transfer) olyan API, amely HTTP-kéréseket használ az adatok cseréjére.

A REST API-nak meg kell felelnie bizonyos kritériumoknak:

  • Kliens-szerver architektúra: a kliens interakcióba lép a felhasználói felülettel, míg a szerver a háttérrel és az adatkezelővel. A kliens és a szerver függetlenek, bármelyikük külön-külön helyettesíthető.
  • Állapotmentes — a kliens adatai nem kerülnek tárolásra a szerveren. Az ülések állapota a kliens oldalon tárolódik.
  • Gyorsíthatóság — a kliensek cache-elhetik a szerver válaszait a teljesítmény javítása érdekében.

Mi az a CRUD?

CRUD — egy programozási koncepció, amely négy alapvető műveletet ír le (create, read, update és delete).

A REST API esetén a kérés típusai és a kérések módszerei a következő műveletekért felelnek: post, get, put, delete.

Most, hogy tisztában vagyunk az alapvető kifejezésekkel, elkezdhetjük az API létrehozását.

Fejlesztés

Hozzunk létre egy mesterséges intelligenciával kapcsolatos idézetgyűjteményt. Az MI mára az egyik legdinamikusabban fejlődő technológia, a Python pedig népszerű eszköz az MI-vel való munkához.

Ezzel az API-val a Python fejlesztője gyorsan hozzáférhet az MI-vel kapcsolatos információkhoz és inspirálódhat az új eredményekből. Ha a fejlesztőnek vannak értékes gondolatai ezzel a témával kapcsolatban, azokat a gyűjteményhez is hozzáadhatja.

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)

Ez a Flask kódrészlet, az Api és a Resource az a két osztály, amire szükségünk van.

A reqparse a Flask-RESTful kérés parse-olási interfésze... Szükségünk lesz a random modulra a véletlenszerű idézet megjelenítéséhez is.

Most létrehozzuk a mesterséges intelligenciával kapcsolatos idézetgyűjteményt.

Minden bejegyzés tartalmazni fogja:

  • digitális ID-t;
  • az idézet írójának nevét;
  • az idézetet.

Mivel ez csak egy tanulási példa, az összes bejegyzést egy Python listában fogjuk tárolni. Egy valódi alkalmazásban azonban valószínűleg adatbázist használnánk helyette.

ai_quotes = [
    {
        "id": 0,
        "author": "Kevin Kelly",
        "quote": "A következő 10 000 startup üzleti terve előre egyszerűen megjósolható: " +
                 "Vedd az X-et és add hozzá az AI-t."
    },
    {
        "id": 1,
        "author": "Stephen Hawking",
        "quote": "A teljes mesterséges intelligencia kifejlesztése jelentheti " +
                 "az emberi faj végének kezdetét… " +
                 "Ez önálló életre kelne, és egyre gyorsabban " +
                 "újra tervezné magát. " +
                 "Az emberek, akik a lassú biológiai evolúcióval korlátozottak, " +
                 "nem tudnának versenyezni, és háttérbe szorulnának."
    },
    {
        "id": 2,
        "author": "Claude Shannon",
        "quote": "Elképzelem azt az időt, amikor mi a robotokhoz fogunk hasonlítani, mint " +
                 "a kutyák az emberekhez, " +
                 "és én a gépeknek szurkolok."
    },
    {
        "id": 3,
        "author": "Elon Musk",
        "quote": "A mesterséges intelligencia fejlődési üteme " +
                 "(nem a szűk értelemben vett AI-ra utalok) " +
                 "hihetetlenül gyors. Ha nincs közvetlen " +
                 "kapcsolatod olyan csoportokkal, mint a Deepmind, " +
                 "fogalmad sincs arról, mennyire gyorsan — ez " +
                 "majdnem exponenciális növekedési ütemen halad. " +
                 "Az, hogy valami komoly veszélyes dolog történik, " +
                 "öt éves időtávon belül várható. " +
                 "Legfeljebb 10 év."
    },
    {
        "id": 4,
        "author": "Geoffrey Hinton",
        "quote": "Mindig is meg voltam győződve arról, hogy a mesterséges intelligencia " +
                 "működtetésének egyetlen módja az, " +
                 "hogy a számítást az emberi agyhoz hasonlóan végezzük. " +
                 "Ez az a cél, amelyet folytatok. Haladunk, " +
                 "bár még sokat kell tanulnunk arról, " +
                 "hogyan működik valójában az agy."
    },
    {
        "id": 5,
        "author": "Pedro Domingos",
        "quote": "Az emberek aggódnak, hogy a számítógépek " +
                 "túl okosak lesznek, és átveszik a világot, " +
                 "de az igazi probléma az, hogy már most is túl buták, " +
                 "és már átvették a világot."
    },
    {
        "id": 6,
        "author": "Alan Turing",
        "quote": "Valószínűnek tűnik, hogy amint a gépi gondolkodás " +
                 "módszere megkezdődik, nem tart sokáig, " +
                 "hogy túlszárnyalja az ember gyenge képességeit… " +
                 "Képesek lesznek beszélgetni " +
                 "egymással, hogy élesebbé tegyék eszüket. " +
                 "Ezért egy bizonyos szakaszban el kellene " +
                 "fogadnunk, hogy a gépek átveszik az irányítást."
    },
    {
        "id": 7,
        "author": "Ray Kurzweil",
        "quote": "A mesterséges intelligencia körülbelül 2029-re eléri " +
                 "az emberi szintet. " +
                 "Aztán, mondjuk, 2045-re, " +
                 "megsokszorozzuk a civilizációnk emberi biológiai gépintelligenciáját " +
                 "egy milliárddal."
    },
    {
        "id": 8,
        "author": "Sebastian Thrun",
        "quote": "Senki sem fogalmaz így, de azt hiszem, " +
                 "hogy a mesterséges intelligencia " +
                 "majdnem egy humán tudományág. Valójában az emberi intelligencia " +
                 "és a humán kogníció megértésére tett kísérlet."
    },
    {
        "id": 9,
        "author": "Andrew Ng",
        "quote": "Ez az analógia azt mondja, hogy az AI az új elekt elektrotechnika." +
                 "Az elektrotechnika átalakította az iparágakat: mezőgazdaság, " +
                 "szállítás, kommunikáció, gyártás."
    }
]

Most már létre kell hoznunk egy Quote erőforrásosztályt, amely meghatározza az API végpontjaink műveleteit. Az osztályon belül négy módszert kell deklarálnunk: get, post, put, delete.

Kezdjük a GET módszerrel

Ez lehetővé teszi, hogy egy adott idézetet kapjunk meg az ID-jának megadásával vagy véletlenszerű idézetet, ha az ID 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 "Idézet nem található", 404

A GET módszer véletlenszerű idézetet ad vissza, ha az ID az alapértelmezett értéket tartalmazza, azaz a módszer hívásakor az ID-t nem adták meg.

Ha meg van adva, a módszer az idézetek között keresi és megtalálja azt, amelyik az adott ID-t tartalmazza. Ha azonban semmit nem talál, akkor a "Idézet nem található, 404" üzenet jelenik meg.

Ne feledje: a módszer 200-as HTTP státuszt ad vissza sikeres lekérdezés esetén és 404-et, ha a bejegyzés nem található.

Most hozzunk létre egy POST módszert új idézet hozzáadásához a tárolóba

Ezek során az új idézetek azonosítóját fogja kapni bevitel közben. Ezen kívül a POST a reqparse-t fogja használni a kéréstestben érkező paraméterek (szerző és idézet szövege) elemzésére.

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"Idézet azonosítóval {id} már létezik", 400
      quote = {
          "id": int(id),
          "author": params["author"],
          "quote": params["quote"]
      }
      ai_quotes.append(quote)
      return quote, 201

A fenti kódban a POST módszer átvette az idézet ID-ját. Ezután a reqparse segítségével megkapta a szerzőt és az idézetet a kérésből, és elmentette őket a params szótárba.

Ha az adott ID-jú idézet már létezik, a módszer megfelelő üzenetet és 400-as kódot ad vissza.

Ha az adott ID-jú idézet még nem lett létrehozva, a módszer létrehoz egy új bejegyzést a megadott ID-val és szerzővel, valamint a többi paraméterrel. Ezután a bejegyzést hozzáadja az ai_quotes listához, és visszaadja az új idézettel együtt a 201-es kódot.

Most hozzunk létre egy PUT módszert a meglévő idézet módosításához a tárolóban

def put(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"]):
              quote["author"] = params["author"]
              quote["quote"] = params["quote"]
              return quote, 200
      
      quote = {
          "id": id,
          "author": params["author"],
          "quote": params["quote"]
      }
      
      ai_quotes.append(quote)
      return quote, 201

A PUT módszer, hasonlóan az előző példához, megkapja az ID-t és az inputot, és elemzi az idézet paramétereit a reqparse használatával.

Ha az adott ID-vel rendelkező idézet létezik, a módszer frissíti azt az új paraméterekkel, majd visszaadja a frissített idézetet 200-as kóddal. Ha az adott ID-vel rendelkező idézet még nem létezik, akkor új bejegyzés jön létre 201-es kóddal.

Végül hozzunk létre egy DELETE módszert az inspirációját elvesztett idézet törlésére.

def delete(self, id):
      global ai_quotes
      ai_quotes = [quote for quote in ai_quotes if quote["id"] != id]
      return f"Az idézet {id} azonosítóval törölve lett.", 200

Ez a módszer megkapja az idézet ID-ját bemeneti értékként, és frissíti az ai_quotes listát a globális listával.

Most, hogy létrehoztuk az összes módszert, csak annyit kell tennünk, hogy hozzáadjuk az erőforrást az API-hoz, megadjuk az útvonalat és elindítjuk a Flaskot.

api.add_resource(Quote, "\/ai-quotes", "\/ai-quotes\/, "\/ai-quotes\/")
if __name__ == '__main__':
    app.run(debug=True)

A REST API Szolgáltatásunk készen áll!

Ezután elmenthetjük a kódot az app.py fájlba, és futtathatjuk a parancssorban a következő paranccsal:

python3 app.py

Ha minden rendben van, akkor valami ilyesmit kapunk:

* Hibakeresési mód: be
* Futtatás 127.0.0.1:5000\/ (CTRL+C megnyomásával megszüntethető)
* Újraindítás állapotban
* Hibakereső aktív!
* Hibakereső PIN: XXXXXXX

API tesztelése

Miután létrehoztuk az API-t, azt tesztelni kell.

Ez megtehető a curl parancssori eszközzel vagy az Insomnia REST klienssel, vagy az API publikálásával a Rapid API-n.

API-t írunk Pythonban (Flask és RapidAPI segítségével)

Az API publikálása

A RapidAPI a világ legnagyobb piactere, több mint 10 000 API-val (és körülbelül 1 millió fejlesztővel).

A RapidAPI nemcsak egységes felületet biztosít harmadik féltől származó API-khoz, hanem lehetőséget biztosít az önálló API gyors és zökkenőmentes publikálására is.

Annak érdekében, hogy Ehhezelőször az API-t egy webszerverre kell publikálnunk. Ebben az esetben a Heroku-t. A használata nem okozhat nehézségeket, (többet tudhat meg róla itt).

Hogyan publikálhatja API-ját a Herokun

1. Telepítjük a Herokut.

Először regisztrálni kell és telepíteni kell a Heroku Parancssori Felületet (CLI). Ez Ubuntu 16+ rendszeren működik.

sudo snap install heroku —classic

Ezután be kell jelentkeznünk:

heroku login

2. Megfelelő fájlok hozzáadása.

Most fájlokat kell hozzáadni a közzétételhez a mi alkalmazásunk mappájában:

  • requirements.txt, a szükséges Python modulok listájával;
  • Procfile, amely megmutatja, hogy milyen parancsokat kell végrehajtani az alkalmazás indításához;
  • .gitignore - a fájlok kizárásához, amelyekre nincs szükség a szerveren.

A requirements.txt fájl a következő sorokat fogja tartalmazni:

  • flask
  • flask-restful
  • a webes kérések kezelésére. Amikor a Quay-hoz kérés érkezik (a saját API-nkon keresztül, vagy a Docker API-n keresztül), egy gevent munkás rendelődik hozzá. Általában ennek a munkásnak kapcsolatba kell lépnie az adatbázissal. Az első hiba után felfedeztük, hogy a gevent munkások az alapértelmezett beállításokkal csatlakoztak az adatbázishoz.

Kérjük, vegye figyelembe: hozzáadtuk a gunicorn-t (Python WSGI HTTP Server) a listához, mivel az alkalmazásunkat a szerveren kell futtatnunk.

A Procfile tartalmazni fogja:

web: gunicorn app:app

.gitignore tartalma:

*.pyc
__pycache__/

Most, hogy létrehoztuk a fájlokat, inicializáljuk a git-repozitóriumot és elkötelezzük:

git init
git add
git commit -m "Első API elkötelezés"

3. Hozzunk létre egy új Heroku-alkalmazást.

heroku create

Küldjük a master ágat az Heroku távoli repóba:

git push heroku master

Most elindíthatjuk az API Service-t a következő parancsokkal:

heroku ps:scale web=1
heroku open
 

Az API elérhető lesz a következő címen: your-random-heroku-name.herokuapp.com/ai-quotes.

Hogyan adjuk hozzá Python API-nkat a RapidAPI piactérhez

Miután az API szolgáltatásunk közzé lett téve a Herokun, hozzáadhatjuk a Rapid API-hoz. Itt részletes dokumentáció erről a témáról található.

1. Hozzunk létre RapidAPI fiókot.

API-t írunk Pythonban (Flask és RapidAPI segítségével)

Ingyenes fiókot hozzunk létre - ezt Facebook, Google vagy GitHub segítségével tehetjük meg.

API-t írunk Pythonban (Flask és RapidAPI segítségével)

2. Adjunk API-t a kezelőpanelhoz.

API-t írunk Pythonban (Flask és RapidAPI segítségével)

3. Ezután adjuk meg az API-ra vonatkozó általános információkat.

API-t írunk Pythonban (Flask és RapidAPI segítségével)

4. Miután rákattintottunk az „API hozzáadása” gombra, megjelenik egy új oldal, ahol megadhatjuk API-nk adatait.

API-t írunk Pythonban (Flask és RapidAPI segítségével)

5. Most vagy kézzel megadhatjuk az API végpontjait, vagy feltölthetjük a swagger-file-t OpenAPI segítségével.

API-t írunk Pythonban (Flask és RapidAPI segítségével)

Most szükséges beállítani API-nk végpontjait a Végpontok oldalon. Az esetünkben a végpontok megfelelnek a CRUD fogalmának (get, post, put, delete).

API-t írunk Pythonban (Flask és RapidAPI segítségével)

Ezután létre kell hoznunk egy GET AI Quote végpontot, amely véletlenszerű idézetet ad vissza (ha az ID alapértelmezett) vagy az adott ID-hoz tartozó idézetet.

A végpont létrehozásához kattintsunk a „Végpont létrehozása” gombra.

API-t írunk Pythonban (Flask és RapidAPI segítségével)

Ismételjük meg ezt a folyamatot az API többi végpontja esetében is. Ennyi! Gratulálok, közzétettük az API-nkat!

Ha minden jól megy, az API oldala valahogy így fog kinézni:

API-t írunk Pythonban (Flask és RapidAPI segítségével)

Zárás

Ebben a cikkben megvizsgáltuk a saját RESTful API Service létrehozásának folyamatát Pythonban, valamint a folyamatot az API felhőben való közzétételére és a RapidAPI katalógusába való felvételére.

De a tesztváltozat csak az API fejlesztésének alapvető elveit mutatta be – olyan finomabb részletek, mint a biztonság, a megbízhatóság és a skálázhatóság nem kerültek megvitatásra.

Valódi API fejlesztésekor mindezt figyelembe kell venni.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster