Písanie API v Pythone (s Flask a RapidAPI)

Písanie API v Pythone (s Flask a RapidAPI)

Ak čítate tento článok, pravdepodobne ste už oboznámení s možnosťami, ktoré prináša používanie API (Application Programming Interface).

Pridaním jedného z mnohých otvorených API do vašej aplikácie môžete rozšíriť funkcionalitu aplikácie alebo ju obohatiť o potrebné dáta. Čo keby ste však vyvinuli jedinečnú funkciu, o ktorú sa chcete podeliť s komunitou?

Odpoveď je jednoduchá: potrebujete vytvorte si vlastné API.

Aj keď sa to na prvý pohľad môže zdať ako náročná úloha, v skutočnosti je to jednoduché. Ukážeme vám, ako to urobiť pomocou Pythonu.

Čo potrebujete, aby ste mohli začať

Na vývoj API potrebujete:

  • Python 3;
  • Banka — jednoduchý a ľahko použiteľný rámec na vytváranie webových aplikácií;
  • Flask-RESTful je rozšírenie pre Flask, ktoré vám umožňuje rýchlo a s minimálnou konfiguráciou vyvinúť REST API.

Inštalácia sa vykonáva príkazom:

pip install flask-restful

Pre začiatočníkov odporúčame bezplatný intenzívny kurz programovania:
Vývoj telegramových botov v C# — 26. – 28. augusta. Bezplatný intenzívny kurz, ktorý vám umožní pochopiť, ako fungujú pomocné roboty, špecifiká práce s Telegram API a ďalšie nuansy. Traja najlepší účastníci dostanú od Skillboxu 30 000 rubľov.

Predtým ako začneš

Chystáme sa vyvinúť RESTful API so základnými Funkcia CRUID.

Aby sme plne pochopili úlohu, pochopme dva vyššie uvedené pojmy.

Čo je REST?

REST API (Representational State Transfer) je rozhranie API, ktoré využíva HTTP požiadavky na výmenu údajov.

Rozhrania REST API musia spĺňať určité kritériá:

  • Architektúra klient-server: Klient interaguje s užívateľským rozhraním a server interaguje s backendom a dátovým úložiskom. Klient a server sú nezávislé, každý z nich môže byť nahradený oddelene od druhého.
  • Bezstavové – na serveri nie sú uložené žiadne údaje klienta. Stav relácie je uložený na strane klienta.
  • Možnosť ukladania do vyrovnávacej pamäte – Klienti môžu ukladať odpovede servera do vyrovnávacej pamäte, aby zlepšili celkový výkon.

čo je CRUD?

Crud je koncepcia programovania, ktorá popisuje štyri základné akcie (vytvoriť, prečítať, aktualizovať a odstrániť).

V REST API sú typy požiadaviek a metódy požiadaviek zodpovedné za akcie, ako je odoslanie, získanie, vloženie, odstránenie.

Teraz, keď rozumieme základným pojmom, môžeme začať vytvárať API.

dizajn

Poďme si vytvoriť úložisko citátov o umelej inteligencii. AI je dnes jednou z najrýchlejšie rastúcich technológií a Python je populárny nástroj na prácu s AI.

Pomocou tohto API môže vývojár Pythonu rýchlo získať informácie o AI a inšpirovať sa novými pokrokmi. Ak má vývojár cenné myšlienky na túto tému, bude ich môcť pridať do úložiska.

Začnime importovaním potrebných modulov a nastavením Flask:

from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)

V tomto úryvku sú triedy Flask, Api a Resource, ktoré potrebujeme.

Reqparse je rozhranie na analýzu dotazov Flask-RESTful... Budete tiež potrebovať náhodný modul na zobrazenie náhodnej cenovej ponuky.

Teraz vytvoríme úložisko citátov o AI.

Každý repo záznam bude obsahovať:

  • digitálny identifikátor;
  • meno autora citátu;
  • citovať.

Keďže toto je len príklad školenia, všetky položky uložíme do zoznamu Python. V skutočnej aplikácii by sme namiesto toho pravdepodobne použili databázu.

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."
    }
]

Teraz musíme vytvoriť triedu prostriedkov Quote, ktorá bude definovať operácie našich koncových bodov API. Vo vnútri triedy musíte deklarovať štyri metódy: získať, uverejniť, vložiť, odstrániť.

Začnime metódou GET

Umožňuje získať konkrétnu cenovú ponuku zadaním jej ID alebo náhodnú cenovú ponuku, ak ID nie je špecifikované.

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

Metóda GET vráti náhodnú cenovú ponuku, ak ID obsahuje predvolenú hodnotu, t.j. pri volaní metódy nebolo zadané žiadne ID.

Ak je zadaný, metóda hľadá medzi citáciami a nájde tú, ktorá obsahuje zadané ID. Ak sa nič nenájde, zobrazí sa správa „Cenová ponuka sa nenašla, 404“.

Pamätajte: metóda vráti stav HTTP 200, ak bola požiadavka úspešná a 404, ak sa záznam nenašiel.

Teraz vytvorte metódu POST na pridanie novej cenovej ponuky do úložiska

Pri písaní získa ID každej novej cenovej ponuky. Okrem toho POST použije reqparse na analýzu parametrov, ktoré budú vložené do tela požiadavky (autor a text citácie).

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

Vo vyššie uvedenom kóde metóda POST akceptovala ID ponuky. Potom pomocou reqparse získal autora a citáciu z dotazu a uložil ich do slovníka params.

Ak cenová ponuka so zadaným ID už existuje, metóda zobrazí zodpovedajúcu správu a kód 400.

Ak citácia so zadaným ID ešte nebola vytvorená, metóda vytvorí nový záznam so zadaným ID a autorom, ako aj ďalšími parametrami. Potom pridá záznam do zoznamu ai_quotes a vráti záznam s novým citátom spolu s kódom 201.

Teraz vytvoríme metódu PUT na zmenu existujúcej cenovej ponuky v úložisku

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

Metóda PUT, podobne ako predchádzajúci príklad, berie ID a vstup a analyzuje parametre ponuky pomocou reqparse.

Ak citácia so zadaným ID existuje, metóda ju aktualizuje o nové parametre a následne vypíše aktualizovanú citáciu s kódom 200. Ak ešte žiadna citácia so zadaným ID neexistuje, vytvorí sa nový záznam s kódom 201.

Nakoniec vytvorte metódu DELETE na odstránenie citátu, ktorý už nie je inšpiratívny

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

Táto metóda získa ID ponuky ako vstup a aktualizuje zoznam ai_quotes pomocou zdieľaného zoznamu.

Teraz, keď sme vytvorili všetky metódy, všetko, čo musíme urobiť, je jednoducho pridať zdroj do API, nastaviť cestu a spustiť Flask.

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

Naša služba REST API je pripravená!

Ďalej môžeme kód uložiť do súboru app.py spustením v konzole pomocou príkazu:

python3 app.py

Ak je všetko v poriadku, dostaneme niečo takéto:

* Režim ladenia: zapnutý
*Beží ďalej 127.0.0.1:5000/ (Pre ukončenie stlačte CTRL+C)
* Reštartovanie so stat
* Debugger je aktívny!
* PIN ladiaceho nástroja: XXXXXXX

Testovanie API

Po vytvorení API je potrebné ho otestovať.

Dá sa to urobiť pomocou pomôcky curl konzoly alebo klienta Insomnia REST alebo zverejnením API na Rapid API.

Písanie API v Pythone (s Flask a RapidAPI)

Zverejňujeme naše API

RapidAPI je najväčší svetový trh s viac ako 10 000 API (a približne 1 miliónom vývojárov).

RapidAPI poskytuje nielen jediné rozhranie na prácu s rozhraniami API tretích strán, ale tiež vám dáva možnosť rýchlo a jednoducho publikovať svoje vlastné API.

Na urob to, najprv ho musíte zverejniť na nejakom serveri v sieti. V našom prípade použijeme Herok. Práca s ním by nemala spôsobovať žiadne ťažkosti, (tu sa o ňom dozviete viac).

Ako publikovať svoje API na Heroku

1. Nainštalujte Heroku.

Prvým krokom je registrácia a inštalácia rozhrania Heroku Command Line Interface (CLI). Toto funguje na Ubuntu 16+.

sudo snap nainštalovať heroku —klasické

Potom sa prihláste:

prihlásenie heroku

2. Pridajte potrebné súbory.

Teraz musíme pridať súbory na zverejnenie do priečinka v našej aplikácii:

  • requirements.txt so zoznamom požadovaných modulov Pythonu;
  • Procfile, ktorý určuje, aké príkazy sa musia vykonať na spustenie aplikácie;
  • .gitignore - na vylúčenie súborov, ktoré nie sú potrebné na serveri.

Súbor requirements.txt bude obsahovať nasledujúce riadky:

  • banka
  • banka-pokojný
  • gunicorn

Upozorňujeme, že sme do zoznamu pridali gunicorn (Python WSGI HTTP Server), pretože potrebujeme spustiť našu aplikáciu na serveri.

Profil bude obsahovať:

web: gunicorn app:app

Obsah .gitignore:

*.pyc
__pycache__/

Teraz, keď sú súbory vytvorené, poďme inicializovať git repo a odovzdať:

git init
git add
git commit -m "First API commit"

3. Vytvorte novú aplikáciu Heroku.

heroku create

Hlavnú vetvu presunieme do vzdialeného repozitára Heroku:

git push heroku master

Teraz môžete začať otvorením služby API pomocou príkazov:

heroku ps:scale web=1
heroku open
 

API bude dostupné na your-random-heroku-name.herokuapp.com/ai-quotes.

Ako pridať svoje Python API na trh RapidAPI

Po zverejnení vašej služby API na Heroku ju môžete pridať do Rapid API. Tu podrobnú dokumentáciu na túto tému.

1. Vytvorte si účet RapidAPI.

Písanie API v Pythone (s Flask a RapidAPI)

Zaregistrujte si bezplatný účet - môžete to urobiť pomocou Facebooku, Google, GitHub.

Písanie API v Pythone (s Flask a RapidAPI)

2. Pridajte API do ovládacieho panela.

Písanie API v Pythone (s Flask a RapidAPI)

3. Ďalej zadajte všeobecné informácie o vašom rozhraní API.

Písanie API v Pythone (s Flask a RapidAPI)

4. Po kliknutí na „Pridať API“ sa zobrazí nová stránka, kde môžete zadať informácie o našom API.

Písanie API v Pythone (s Flask a RapidAPI)

5. Teraz môžete buď manuálne zadať koncové body API alebo stiahnuť swagger-file pomocou OpenAPI.

Písanie API v Pythone (s Flask a RapidAPI)

Teraz musíme nastaviť koncové body nášho API na stránke Koncové body. V našom prípade koncové body zodpovedajú konceptu CRUD (get, post, put, delete).

Písanie API v Pythone (s Flask a RapidAPI)

Ďalej musíte vytvoriť koncový bod GET AI Quote, ktorý zobrazí náhodnú cenovú ponuku (ak je ID predvolené) alebo cenovú ponuku pre zadané ID.

Ak chcete vytvoriť koncový bod, kliknite na tlačidlo „Vytvoriť koncový bod“.

Písanie API v Pythone (s Flask a RapidAPI)

Tento proces opakujeme pre všetky ostatné koncové body API. To je všetko! Gratulujeme, zverejnili ste svoje API!

Ak je všetko v poriadku, stránka API bude vyzerať asi takto:

Písanie API v Pythone (s Flask a RapidAPI)

Záver

V tomto článku sme sa naučili proces vytvárania vašej vlastnej RESTful API Service v Pythone spolu s procesom publikovania API do cloudu Heroku a jeho pridávania do adresára RapidAPI.

Ale testovacia verzia ukázala len základné princípy vývoja API – nuansy ako bezpečnosť, odolnosť voči chybám a škálovateľnosť neboli brané do úvahy.

Pri vývoji skutočného API je potrebné toto všetko vziať do úvahy.

Zdroj: hab.com

Pridať komentár