API írása Pythonban (Flask és RapidAPI segítségével)

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

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 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 írása Pythonban (Flask és RapidAPI segítségével)

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:

heroku ps:scale web=1
heroku open
 

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

Python API hozzáadása a RapidAPI piactérhez

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.

API írása Pythonban (Flask és RapidAPI segítségével)

Regisztráljon ingyenes fiókot – ezt megteheti a Facebook, Google, GitHub segítségével.

API írása Pythonban (Flask és RapidAPI segítségével)

2. Adja hozzá az API-t a vezérlőpulthoz.

API írása Pythonban (Flask és RapidAPI segítségével)

3. Ezután adja meg az API általános adatait.

API írása Pythonban (Flask és RapidAPI segítségével)

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.

API írása Pythonban (Flask és RapidAPI segítségével)

5. Most vagy manuálisan megadhatja az API-végpontokat, vagy letöltheti swagger-akta OpenAPI használatával.

API írása Pythonban (Flask és RapidAPI segítségével)

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

API írása Pythonban (Flask és RapidAPI segítségével)

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.

API írása Pythonban (Flask és RapidAPI segítségével)

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:

API írása Pythonban (Flask és RapidAPI segítségével)

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.

Forrás: will.com

Hozzászólás