Tvoření API v Pythonu (s Flask a RapidAPI)

Tvoření API v Pythonu (s Flask a RapidAPI)

Pokud čtete tento článek, pravděpodobně již znáte možnosti, které se otevírají při používání API (rozhraní pro programování aplikací).

Přidáním jednoho z mnoha otevřených API do vaší aplikace můžete rozšířit její funkčnost nebo ji doplnit potřebnými daty. Ale co když jste vyvinuli unikátní funkci, kterou chcete sdílet s komunitou?

Odpověď je jednoduchá: je nutné vytvořit vlastní API.

I když se to zpočátku zdá jako složitý úkol, ve skutečnosti je to snadné. Ukážeme vám, jak na to s pomocí Pythonu.

Co potřebujete pro zahájení práce

Pro vývoj API budete potřebovat:

  • Python 3;
  • Flask — jednoduchý a snadno použitelný rámec pro vytváření webových aplikací;
  • Flask-RESTful — rozšíření pro Flask, které umožňuje rychlé vyvinutí REST API s minimálními nastaveními.

Instalaci provedete pomocí příkazu:

pip install flask-restful

Doporučujeme bezplatný intenzivní kurz programování pro začátečníky:
Vývoj telegramového bota v C# — 26.–28. srpna. Bezplatný intenzivní kurz, který vám umožní pochopit, jak fungují pomocné boty, zvláštnosti práce s API Telegram a další nuance. Tři nejlepší účastníci získají od Skillboxu 30 000 rublů..

Než začneme

Chystáme se vyvinout RESTful API s základní funkcionalitou CRUID.

Abychom plně porozuměli úkolu, pojďme si objasnit dva výrazy, které jsme zmínili výše.

Co je REST?

REST API (přenositelný stavový přenos) je API, které používá HTTP požadavky pro výměnu dat.

REST API musí splňovat určité kritérium:

  • Architektura klient-server: klient interaguje s uživatelským rozhraním, zatímco server s backendem a úložištěm dat. Klient a server jsou nezávislé, kterýkoli z nich může být vyměněn nezávisle na druhém.
  • Bezstavovost — žádná data klienta se na serveru neukládají. Stav relace se uchovává na straně klienta.
  • Cacheovatelnost — klienti mohou cachovat odpovědi serveru za účelem zvýšení celkového výkonu.

Co je CRUD?

CRUD — koncept programování, který popisuje čtyři základní akce (vytvoření, čtení, úprava a vymazání).

V REST API typy požadavků a metody požadavků odpovídají za takové akce, jakými jsou post, get, put, delete.

Nyní, když jsme si objasnili základní pojmy, můžeme přistoupit k vytvoření API.

Vývoj

Vytvořme repozitář citátů o umělé inteligenci. AI je jednou z nejrychleji se rozvíjejících technologií dnes a Python je oblíbeným nástrojem pro práci s AI.

S tímto API bude moci vývojář Pythonu rychle získávat informace o AI a inspirovat se novými úspěchy. Pokud má vývojář cenné myšlenky na toto téma, může je přidat do repozitáře.

Začněme importovat potřebné moduly a nastavíme Flask:

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

V tomto úryvku jsou Flask, Api a Resource třídy, které potřebujeme.

Reqparse je rozhraní pro parsování požadavků Flask-RESTful... Také budeme potřebovat modul random pro zobrazení náhodného citátu.

Nyní vytvoříme repozitář citátů o AI.

Každý záznam v repozitáři bude obsahovat:

  • digitální ID;
  • jméno autora citátu;
  • citát.

Jelikož je to pouze příklad pro výuku, uložíme všechny záznamy do seznamu Python. Ve skutečné aplikaci bychom však pravděpodobně použili databázi.

ai_quotes = [
    {
        "id": 0,
        "author": "Kevin Kelly",
        "quote": "Podnikatelské plány následujících 10 000 startupů se snadno předpovídají: " +
                 "Vezměte X a přidejte AI."
    },
    {
        "id": 1,
        "author": "Stephen Hawking",
        "quote": "Vývoj plně umělé inteligence by mohl " +
                 "znamenat konec lidské rasy… " +
                 "Ona by si dala na čas sama, a přepracovala " +
                 "se neustále při stále se zrychlujícím tempu. " +
                 "Lidé, kteří jsou omezeni pomalou biologickou evolucí, " +
                 "by neměli šanci a byli by překonáni."
    },
    {
        "id": 2,
        "author": "Claude Shannon",
        "quote": "Představuji si dobu, kdy budeme robotům jako " +
                 "psi lidem, " +
                 "a já fandím strojům."
    },
    {
        "id": 3,
        "author": "Elon Musk",
        "quote": "Tempo pokroku v umělé inteligenci " +
                 "(neodkazuji na úzkou AI) " +
                 "je neuvěřitelně rychlé. Pokud nemáte přímou " +
                 "expozici skupinám jako Deepmind, " +
                 "nemáte ponětí, jak rychle — roste " +
                 "tempo blízké exponenciálnímu. " +
                 "Riziko, že se něco vážně nebezpečného " +
                 "stane, se nachází v horizontu pěti let." +
                 "10 let maximálně."
    },
    {
        "id": 4,
        "author": "Geoffrey Hinton",
        "quote": "Vždy jsem byl přesvědčen, že jediným způsobem, " +
                 "jak donutit umělou inteligenci fungovat, " +
                 "je provádět výpočty podobným způsobem jako lidský mozek. " +
                 "To je cíl, kterého se snažím dosáhnout. Děláme pokroky, " +
                 "i když se stále musíme mnoha věcem naučit, " +
                 "jak mozek vlastně funguje."
    },
    {
        "id": 5,
        "author": "Pedro Domingos",
        "quote": "Lidé se obávají, že počítače budou " +
                 "příliš chytré a vezmou si svět, " +
                 "ale skutečný problém je, že jsou příliš hloupé " +
                 "a už si svět vzaly."
    },
    {
        "id": 6,
        "author": "Alan Turing",
        "quote": "Zdá se pravděpodobné, že jakmile se metoda myšlení strojů " +
                 "zahájí, nebude trvat dlouho, " +
                 "než překonají naše slabé schopnosti… " +
                 "Budou schopni spolu komunikovat, " +
                 "aby si ostřili své důvtipy. " +
                 "V určitém stadiu bychom tedy měli " +
                 "očekávat, že stroje převezmou kontrolu."
    },
    {
        "id": 7,
        "author": "Ray Kurzweil",
        "quote": "Umělá inteligence dosáhne " +
                 "lidské úrovně přibližně kolem roku 2029. " +
                 "Pokud to prodloužíte dál, řekněme, do roku 2045, " +
                 "násobíme inteligenci, " +
                 "inteligenci lidského biologického stroje " +
                 "naší civilizace miliardkrát."
    },
    {
        "id": 8,
        "author": "Sebastian Thrun",
        "quote": "Nikdo to takto neříká, ale myslím si, " +
                 "že umělá inteligence " +
                 "je téměř humanitní disciplínou. Je to opravdu pokus " +
                 "pochopit lidskou inteligenci a lidské kognice."
    },
    {
        "id": 9,
        "author": "Andrew Ng",
        "quote": "Děláme tuto analogii, že AI je nová elektřina." +
                 "Elektřina proměnila odvětví: zemědělství, " +
                 "doprava, komunikace, výroba."
    }
]

Nyní musíme vytvořit zdrojovou třídu Quote, která bude definovat operace koncových bodů našeho API. Uvnitř třídy je třeba deklarovat čtyři metody: get, post, put, delete.

Začneme metodou GET

Ta umožňuje získat konkrétní citát na základě jeho ID, nebo náhodný citát, pokud ID není uvedeno.

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

Metoda GET vrací náhodný citát, pokud ID má výchozí hodnotu, tj. při volání metody nebylo ID zadáno.

Pokud je ID zadáno, metoda prohledává citáty a najde ten, který odpovídá zadanému ID. Pokud nebyl nalezen žádný, zobrazí se zpráva “Quote not found, 404”.

Pamatujte: metoda vrací HTTP status 200 při úspěšném požadavku a 404, pokud záznam nebyl nalezen.

Nyní vytvořme POST metodu pro přidání nového citátu do úložiště

Ta obdrží identifikátor každého nového citátu při zadání. Kromě toho POST používá reqparse pro analýzu parametrů, které budou zaslány v těle požadavku (autor a text citátu).

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

Ve výše uvedeném kódu POST metoda přijala ID citátu. Poté, pomocí reqparse, získala autora a citát z požadavku a uložila je do slovníku params.

Pokud citát se zadaným ID již existuje, metoda vrátí příslušnou zprávu a kód 400.

Pokud citát se zadaným ID ještě nebyl vytvořen, metoda vytvoří nový záznam se zadaným ID a autorem, jakož i dalšími parametry. Pak přidá záznam do seznamu ai_quotes a vrátí záznam s novým citátem spolu s kódem 201.

Nyní vytvořme PUT metodu pro změnu existujícího citátu v úložišti

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

Metoda PUT, podobně jako v předchozím příkladu, bere ID a input a parsuje parametry citátu pomocí reqparse.

Pokud citát se zadaným ID existuje, metoda jej aktualizuje s novými parametry a poté vrátí aktualizovaný citát s kódem 200. Pokud citát se zadaným ID ještě neexistuje, vytvoří se nový záznam s kódem 201.

Nakonec vytvořme DELETE metodu pro odstranění citátu, který už nás inspiruje.

def delete(self, id):
      global ai_quotes
      ai_quotes = [quote for quote in ai_quotes if quote["id"] != id]
      return f"Citát s id {id} byl smazán.", 200

Tato metoda získává ID citátu při vstupu a aktualizuje seznam ai_quotes pomocí globálního seznamu.

Nyní, když jsme vytvořili všechny metody, vše, co potřebujeme, je jednoduše přidat resource k API, nastavit cestu a spustit Flask.

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

Naše REST API služba je připravena!

Dále můžeme uložit kód do souboru app.py a spustit ho v konzoli pomocí příkazu:

python3 app.py

Pokud je vše v pořádku, pak dostaneme něco takového:

* Debug mode: zapnuto
* Běžící na 127.0.0.1:5000\/ (Stiskněte CTRL+C pro ukončení)
* Restartování s statem
* Debugger je aktivní!
* Debugger PIN: XXXXXXX

Testujeme API

Jakmile je API vytvořeno, je potřeba jej otestovat.

To lze provést pomocí konzolového nástroje curl, klienta Insomnia REST nebo zveřejněním API na Rapid API.

Tvoření API v Pythonu (s Flask a RapidAPI)

Zveřejňujeme naše API

RapidAPI je největší světový trh s více než 10 000 API (a přibližně 1 milionem vývojářů).

RapidAPI nejen poskytuje jednotné rozhraní pro práci s externími API, ale také umožňuje rychle a bez problémů publikovat vaše vlastní API.

Abychom to lze provést, nejprve je potřeba jej publikovat na nějakém serveru v síti. V našem případě využijeme Heroku. Práce s ním by neměla způsobit žádné potíže, (více informací o něm lze najít zde).

Jak publikovat vaše API na Heroku

1. Nainstalujte Heroku.

Nejprve je potřeba se zaregistrovat a nainstalovat Heroku Command Line Interface (CLI). To funguje na Ubuntu 16+.

sudo snap install heroku --classic

Poté se přihlásíme:

heroku login

2. Přidáváme potřebné soubory.

Nyní je potřeba přidat soubory pro publikaci do složky v našem aplikaci:

  • requirements.txt se seznamem potřebných Python modulů;
  • Procfile, který uvádí, jaké příkazy by měly být provedeny pro spuštění aplikace;
  • .gitignore — k vyloučení souborů, které nejsou na serveru potřebné.

Soubor requirements.txt bude obsahovat následující řádky:

  • flask
  • flask-restful
  • gunicorn

Vezměte prosím na vědomí: přidali jsme gunicorn (Python WSGI HTTP Server) na seznam, protože je potřeba spustit naši aplikaci na serveru.

Procfile bude obsahovat:

web: gunicorn app:app

Obsah .gitignore:

*.pyc
__pycache__/

Nyní, když byly vytvořeny soubory, inicializujme git-repo a zkomitujme:

git init
git add
git commit -m "První API commit"

3. Vytvořte novou aplikaci na Heroku.

heroku create

Odešlete master branch do vzdáleného repozitáře Heroku:

git push heroku master

Nyní můžete začít tím, že otevřete API Service příkazem:

heroku ps:scale web=1
heroku open
 

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

Jak přidat váš Python API na tržiště RapidAPI

Jakmile je API služba zveřejněna na Heroku, lze ji přidat k Rapid API. Zde je podrobná dokumentace k tomuto tématu.

1. Vytvořte účet RapidAPI.

Tvoření API v Pythonu (s Flask a RapidAPI)

Zaregistrujte si bezplatný účet — to lze provést pomocí Facebooku, Googlu, GitHubu.

Tvoření API v Pythonu (s Flask a RapidAPI)

2. Přidejte API do přehledu.

Tvoření API v Pythonu (s Flask a RapidAPI)

3. Dále zadejte základní informace o svém API.

Tvoření API v Pythonu (s Flask a RapidAPI)

4. Po kliknutí na "Add API" se zobrazí nová stránka, kde můžete zadat informace o našem API.

Tvoření API v Pythonu (s Flask a RapidAPI)

5. Nyní můžete buď ručně zadat endpointy API, nebo nahrát swagger-file pomocí OpenAPI.

Tvoření API v Pythonu (s Flask a RapidAPI)

Nyní je potřeba zadat endpointy našeho API na stránce Endpoints. V našem případě endpointy odpovídají konceptu CRUD (get, post, put, delete).

Tvoření API v Pythonu (s Flask a RapidAPI)

Dále je potřeba vytvořit endpoint GET AI Quote, který vrací náhodný citát (pokud je ID výchozí) nebo citát pro zadané ID.

Pro vytvoření endpointu stiskněte tlačítko „Create Endpoint“.

Tvoření API v Pythonu (s Flask a RapidAPI)

Opakujte tento proces pro všechny ostatní endpointy API. To je vše! Gratuluji, zveřejnili jste své API!

Pokud je vše v pořádku, stránka API bude vypadat takto:

Tvoření API v Pythonu (s Flask a RapidAPI)

Závěr

V tomto článku jsme prozkoumali proces vytváření vlastního RESTful API Service na Pythonu, spolu s procesem publikování API v cloudu Heroku a přidáním do katalogu RapidAPI.

V testovací variantě byly představeny pouze základní principy vývoje API — takové aspekty jako bezpečnost, odolnost a škálovatelnost nebyly probrány.

Při vývoji skutečného API je třeba na to vše brát zřetel.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster