Pišemo API na Pythonu (s Flask in RapidAPI)

Pišemo API na Pythonu (s Flask in RapidAPI)

Če berete ta članek, ste verjetno že seznanjeni z možnostmi, ki jih ponuja uporaba API (vmesnik za programsko uporabo).

Z dodajanjem enega od številnih odprtih API-jev v vašo aplikacijo lahko razširite funkcionalnost te aplikacije ali pa jo dopolnite s potrebnimi podatki. Ampak kaj, če ste razvili edinstveno funkcijo, s katero želite deliti skupnost?

Odgovor je preprost: treba je ustvariti svoj API.

Čeprav se to sprva zdi težka naloga, v resnici ni nič zapletenega. Povedali vam bomo, kako to narediti s pomočjo Pythona.

Kaj potrebujete za začetek dela

Za razvoj API-ja potrebujete:

  • Python 3;
  • Flask — preprost in enostaven za uporabo okvir za ustvarjanje spletnih aplikacij;
  • Flask-RESTful — razširitev za Flask, ki omogoča hitro in z minimalno nastavitev razvijanje REST API.

Namestitev se izvede s ukazom:

pip install flask-restful

Priporočamo brezplačni intenzivni tečaj programiranja za začetnike:
Razvoj telegram-bota v C# — 26–28 avgusta. Brezplačni intenzivni tečaj, ki omogoča razumevanje, kako delujejo pomočniki, posebnosti dela z API-jem Telegram in druge podrobnosti. Trojica najboljših udeležencev bo od Skillbox prejela 30.000 rubljev.

Preden začnemo

Nameravamo razviti RESTful API z osnovno CRUD-funkcionalnostjo.

Da bi popolnoma razumeli nalogo, se pogovorimo o dveh izrazih, omenjenih zgoraj.

Kaj je REST?

REST API (Predstavitvena stanja prenosa) — to je API, ki uporablja HTTP-poizvedbe za izmenjavo podatkov.

REST API morajo ustrezati določenim kriterijem:

  • Arhitektura odjemalec-strežnik: odjemalec komunicira z uporabniškim vmesnikom, strežnik pa z zadnjo stranjo in podatkovnim skladiščem. Odjemalec in strežnik sta neodvisna, vsak od njiju se lahko zamenja neodvisno od drugega.
  • Brez stanja — nobeni podatki odjemalca se ne shranjujejo na strežniku. Stanje seje se hrani na strani odjemalca.
  • Predpomnjenje — odjemalci lahko predpomnijo odgovore strežnika za izboljšanje celotne zmogljivosti.

Kaj je CRUD?

CRUD — koncept programiranja, ki opisuje štiri osnovne akcije (ustvari, preberi, posodobi in izbriši).

V REST API je vrste poizvedb in metode poizvedbe odgovorne za takšne akcije, kot so post, get, put, delete.

Zdaj, ko smo razjasnili osnovne izraze, lahko začnemo s kreiranjem API-ja.

Razvoj

Ustvarimo repozitorij citatov o umetni inteligenci. Umetna inteligenca je ena izmed najbolj hitro rastočih tehnologij danes, Python pa je priljubljeno orodje za delo z umetno inteligenco.

S tem API-jem bo razvijalec v Pythonu lahko hitro pridobivatel informacije o umetni inteligenci in se navduševal nad novimi dosežki. Če ima razvijalec dragocene misli na to temo, jih lahko doda v repozitorij.

Začnimo z uvozom potrebnih modulov in nastavitvijo Flaska:

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

V tem kosu kode Flask, Api in Resource so razredi, ki jih potrebujemo.

Reqparse je vmesnik za obdelavo zahtevkov v Flask-RESTful… Potrebovali bomo tudi modul random za prikaz naključnega citata.

Zdaj bomo ustvarili repozitorij citatov o umetni inteligenci.

Vsak vnos v repozitorij bo vseboval:

  • digitalni ID;
  • ime avtorja citata;
  • citat.

Ker je to le primer za učenje, bomo shranili vse vnose v Python seznamu. V realni aplikaciji pa bi verjetno uporabili bazo podatkov.

ai_quotes = [
    {
        "id": 0,
        "author": "Kevin Kelly",
        "quote": "Poslovni načrti naslednjih 10.000 zagonskih podjetij so enostavni za napovedovanje: " +
                 "Vzemite X in dodajte AI."
    },
    {
        "id": 1,
        "author": "Stephen Hawking",
        "quote": "Razvoj popolne umetne inteligence bi lahko " +
                 "znanil konec človeške rase… " +
                 "Sama bi se razvila naprej in " +
                 "se preoblikovala v vedno večji meri. " +
                 "Ljudi, ki jih omejuje počasna biološka evolucija, " +
                 "ne bi mogli konkurirati in bi bili nadomeščeni."
    },
    {
        "id": 2,
        "author": "Claude Shannon",
        "quote": "Vizualiziram si čas, ko bomo roboti podobni temu, kar " +
                 "so psi za ljudi, " +
                 "in navijam za stroje."
    },
    {
        "id": 3,
        "author": "Elon Musk",
        "quote": "Tempo napredka v umetni inteligenci " +
                 "(ne mislim na ozko AI) " +
                 "je neverjetno hitro. Razen če imate neposredno " +
                 "izkušnjo z skupinami, kot je Deepmind, " +
                 "nimate pojma, kako hitro — raste " +
                 "s hitrostjo, ki je blizu eksponentni. " +
                 "Tveganje, da se zgodi kaj resno nevarnega, " +
                 "je v petletnem okviru. " +
                 "10 let največ."
    },
    {
        "id": 4,
        "author": "Geoffrey Hinton",
        "quote": "Vedno sem bil prepričan, da je edini način, " +
                 "da umetna inteligenca deluje, " +
                 "ta, da se izračuni izvajajo na način, podoben človeškemu možganu. " +
                 "To je cilj, ki ga zasledujem. Napredujemo, " +
                 "čeprav se moramo še veliko naučiti o " +
                 "tem, kako dejansko deluje možgani."
    },
    {
        "id": 5,
        "author": "Pedro Domingos",
        "quote": "Ljudje se bojijo, da bodo računalniki " +
                 "postali preveč pametni in prevzeli svet, " +
                 "vendar je pravi problem, da so preveč neumni " +
                 "in so že prevzeli svet."
    },
    {
        "id": 6,
        "author": "Alan Turing",
        "quote": "Zdi se verjetno, da ko se začne metodo " +
                 "mišljenja strojev, ne bo dolgo, " +
                 "da nas ne bodo prehiteli… " +
                 "Bili bi sposobni pogovarjati " +
                 "med seboj, da izostrijo svoje spodbude. " +
                 "Na neki točki se moramo zato " +
                 "pričakovati, da bodo stroji prevzeli nadzor."
    },
    {
        "id": 7,
        "author": "Ray Kurzweil",
        "quote": "Umetna inteligenca bo dosegla " +
                 "človeške ravni okoli leta 2029. " +
                 "Če to nadaljujemo naprej do, recimo, leta 2045, " +
                 "bomo pomnožili inteligenco, " +
                 "človeške biološke mehanizme inteligence " +
                 "našega človeštva milijardo krat."
    },
    {
        "id": 8,
        "author": "Sebastian Thrun",
        "quote": "Nihče ne pove te stvari na ta način, vendar menim, " +
                 "da je umetna inteligenca " +
                 "skoraj disciplina humanistike. Gre za poskus " +
                 "razumevanja človeške inteligence in človeškega spoznavanja."
    },
    {
        "id": 9,
        "author": "Andrew Ng",
        "quote": "Delamo to analogijo, da je AI nova elektrika." +
                 "Elektrika je spremenila industrije: kmetijstvo, " +
                 "transport, komunikacijo, proizvodnjo."
    }
]

Sedaj je treba ustvariti razred Quote, ki bo določal operacije končnih točk našega API-ja. Znotraj razreda moramo deklarirati štiri metode: get, post, put, delete.

Začnimo z metodo GET

Ta omogoča pridobitev določene citate tako, da navedemo njen ID, ali pa naključno citato, če ID ni naveden.

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 vrne naključno citato, če ID vsebuje privzeto vrednost, tj. ko je metoda poklicana ID ni bil določen.

Če je ID naveden, metoda išče med citati in najde tistega, ki vsebuje navedeni ID. Če pa nič ni najdeno, se izpiše sporočilo "Quote not found, 404".

Ne pozabite: metoda vrne HTTP status 200 v primeru uspešnega zahtevka in 404, če zapis ni bil najden.

Zdaj pa ustvarimo POST metodo za dodajanje nove citate v repozitorij.

Sprejela bo identifikator vsake nove citate ob vnosu. Poleg tega bo POST uporabljal reqparse za razčlenitev parametrів, ki bodo šli v telo zahtevka (avtor in tekst citate).

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

V zgornji kodi je POST metoda sprejela ID citate. Nato je z uporabo reqparse pridobila avtorja in citat iz zahtevka, in ju shranila v slovar params.

Če citata z navedenim ID-jem že obstaja, metoda izpiše ustrezno sporočilo in kodo 400.

Če citata z navedenim ID-jem še ni bilo ustvarjeno, metoda ustvari nov zapis z navedenim ID-jem in avtorjem ter drugimi parametri. Nato doda zapis v seznam ai_quotes in vrne zapis z novo citato skupaj s kodo 201.

Zdaj ustvarimo PUT metodo za spreminjanje obstoječe citate v repozitoriju.

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, podobno kot v prejšnjem primeru, vzame ID in input ter analizira parametre citata s pomočjo reqparse.

Če citat z določenim ID obstaja, bo metoda posodobila njen novimi parametri in nato izpisala posodobljen citat s kodo 200. Če citat z določenim ID še ne obstaja, bo ustvarila nov vnos s kodo 201.

Nazadnje, ustvarimo metodo DELETE za brisanje citata, ki nas že ne navdihuje.

def delete(self, id):
      global ai_quotes
      ai_quotes = [qoute for qoute in ai_quotes if qoute["id"] != id]
      return f"Citat z id {id} je izbrisan.", 200

Ta metoda prejme ID citata ob vhodu in posodobi seznam ai_quotes z uporabo skupnega seznama.

Zdaj, ko smo ustvarili vse metode, moramo le dodati vir v API, določiti pot in zagnati Flask.

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

Naša REST API storitev je pripravljena!

Nato lahko shranimo kodo v datoteko app.py ter jo zaženemo v konzoli s pomočjo ukaza:

python3 app.py

Če je vse v redu, dobimo nekaj takega:

* Način za odpravljanje napak: vklopljen
* Poteka na 127.0.0.1:5000\/ (Pritisnite CTRL+C za izhod)
* Ponovno se zažene z stat
* Razvijalec je aktiven!
* Pin za razvijalce: XXXXXXX

Testiramo API

Ko je API ustvarjen, ga je treba testirati.

To lahko storimo s pomočjo konzolne aplikacije curl ali odjemalca Insomnia REST ali pa objavimo API na Rapid API.

Pišemo API na Pythonu (s Flask in RapidAPI)

Objavimo naš API

RapidAPI je največja svetovna tržnica z več kot 10.000 API-ji (in približno 1 milijonom razvijalcev).

RapidAPI ne le da ponuja enoten vmesnik za delo s tretjimi API-ji, temveč omogoča hitro in enostavno objavo vašega lastnega API-ja.

Za to, da da to, najprej ga je treba objaviti na katerem koli strežniku v omrežju. V našem primeru bomo uporabili Heroku. Delo z njim ne bi smelo povzročati težav, (več o njem lahko izveste tukaj).

Kako objaviti svoj API na Heroku

1. Namestimo Heroku.

Najprej se je treba registrirati in namestiti vmesnik Heroku Command Line (CLI). Deluje na Ubuntu 16+.

sudo snap install heroku —classic

Nato se prijavimo:

heroku login

2. Dodamo potrebne datoteke.

Zdaj je treba dodati datoteke za objavo v mapo v naši aplikaciji:

  • requirements.txt s seznamom potrebnih modulov v Pythonu;
  • Procfile, ki določa, katere ukaze je treba izvesti za zagon aplikacije;
  • .gitignore — za izključitev datotek, ki niso potrebne na strežniku.

Datoteka requirements.txt bo vsebovala naslednje vrstice:

  • flask
  • flask-restful
  • gunicorn

Prosím, mějte na paměti, že jsme přidali gunicorn (Python WSGI HTTP Server) do seznamu, 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 soubory vytvořeny, inicializujme git repo a proveďme commit:

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

3. Vytvořte novou aplikaci Heroku.

heroku create

Odesíláme master branch do vzdáleného repozitáře Heroku:

git push heroku master

Nyní můžete začít otevřením API služby pomocí příkazů:

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 do tržiště RapidAPI

Jakmile je API služba publikována na Heroku, můžete ji přidat k Rapid API. Zde je podrobná dokumentace k tomuto tématu.

1. Vytvořte účet na RapidAPI.

Pišemo API na Pythonu (s Flask in RapidAPI)

Zaregistrujte si zdarma účet — můžete to provést prostřednictvím Facebooku, Google nebo GitHubu.

Pišemo API na Pythonu (s Flask in RapidAPI)

2. Přidejte API do řídícího panelu.

Pišemo API na Pythonu (s Flask in RapidAPI)

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

Pišemo API na Pythonu (s Flask in RapidAPI)

4. Po stisknutí tlačítka „Add API“ se objeví nová stránka, kde můžete zadat informace o vašem API.

Pišemo API na Pythonu (s Flask in RapidAPI)

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

Pišemo API na Pythonu (s Flask in RapidAPI)

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

Pišemo API na Pythonu (s Flask in RapidAPI)

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

Pro vytvoření endpointu je potřeba stisknout tlačítko „Create Endpoint“.

Pišemo API na Pythonu (s Flask in RapidAPI)

Tento proces opakujeme pro všechny ostatní endpointy API. A je to! Gratuluji, publikovali jste své API!

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

Pišemo API na Pythonu (s Flask in RapidAPI)

Zaključek

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

Ale v testovací variantě byly ukázány pouze základní principy vývoje API — takové nuance, jako je bezpečnost, odolnost a škálovatelnost, nebyly zvažovány.

Při vývoji skutečného API je třeba to vše vzít v úvahu.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster