Pisanje API-ja u Pythonu (s Flask i RapidAPI)

Pisanje API-ja u Pythonu (s Flask i RapidAPI)

Ako čitate ovaj članak, vjerojatno ste već upoznati s mogućnostima koje se otvaraju korištenjem API-ja (Application Programming Interface).

Dodavanjem jednog od mnogih otvorenih API-ja u svoju aplikaciju, možete proširiti funkcionalnost te aplikacije ili je obogatiti potrebnim podacima. No, što ako ste razvili jedinstvenu funkcionalnost koju želite podijeliti s zajednicom?

Odgovor je jednostavan: morate napraviti vlastiti API..

Iako se to isprva može činiti složenim zadatkom, zapravo je vrlo jednostavno. Objasnit ćemo kako to učiniti koristeći Python.

Što vam je potrebno za početak rada

Za razvoj API-ja potrebni su:

  • Python 3;
  • Flask — jednostavan i lagan za korištenje framework za izradu web aplikacija;
  • Flask-RESTful — proširenje za Flask koje omogućuje brzu izradu REST API-ja s minimalnom konfiguracijom.

Instalacija se vrši naredbom:

pip install flask-restful

Preporučujemo besplatni intenzivni tečaj programiranja za početnike:
Razvoj Telegram bota na C# — od 26. do 28. kolovoza. Besplatni intenzivni tečaj koji omogućuje razumijevanje rada pomoćnih botova, značajki rada s API-jem Telegram i drugih nijansi. Troje najboljih sudionika dobit će 30 000 rubalja od Skillbox-a..

Prije nego što počnemo

planiramo razviti RESTful API s osnovnom CRUD funkcionalnošću..

Da bismo potpuno razumjeli zadatak, razjasnimo dva pojma koja su spomenuta ranije.

Što je REST?

REST API (Representational State Transfer) je API koji koristi HTTP zahtjeve za razmjenu podataka.

REST API mora zadovoljiti određene kriterije:

  • Arhitektura klijent-server: klijent interagira s korisničkim sučeljem, dok poslužitelj komunicira s backendom i skladištem podataka. Klijent i poslužitelj su neovisni, svaki od njih može biti zamijenjen neovisno o drugome.
  • Stateless — nikakvi klijentski podaci se ne pohranjuju na poslužitelju. Stanje sesije pohranjuje se na strani klijenta.
  • Keširanje — klijenti mogu keširati odgovore poslužitelja za poboljšanje ukupne izvedbe.

Što je CRUD?

CRUD — koncept programiranja koji opisuje četiri osnovne radnje (create, read, update i delete).

U REST API-ju tipovi zahtjeva i metode zahtjeva odgovaraju takvim radnjama kao što su post, get, put, delete.

Sada kada smo razjasnili osnovne pojmove, možemo započeti s izradom API-ja.

Razvoj

Hajde da stvorimo repozitorij za citate o umjetnoj inteligenciji. AI je jedna od najaktivnije razvijajućih tehnologija danas, a Python je popularan alat za rad s AI.

S ovom API-em, Python programer će moći brzo dobivati informacije o AI i inspirirati se novim dostignućima. Ako programer ima vrijedne misli o ovoj temi, moći će ih dodati u repozitorij.

Započnimo s uvozom potrebnih modula i postavljanjem Flaska:

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

U ovoj Flask snippetu, Api i Resource su klase koje su nam potrebne.

Reqparse je sučelje za parsiranje zahtjeva Flask-RESTful... Također će nam trebati modul random za prikaz slučajnog citata.

Sada ćemo stvoriti repozitorij citata o AI.

Svaka stavka repozitorija će sadržavati:

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

Budući da je ovo samo primjer za učenje, sve stavke ćemo spremiti u Python listu. U pravoj aplikaciji bismo vjerojatno koristili bazu podataka umjesto toga.

ai_quotes = [
    {
        "id": 0,
        "author": "Kevin Kelly",
        "quote": "Poslovni planovi sljedećih 10.000 startup-a lako su predvidljivi: " +
                 "Uzmite X i dodajte umjetnu inteligenciju."
    },
    {
        "id": 1,
        "author": "Stephen Hawking",
        "quote": "Razvoj potpune umjetne inteligencije mogao bi " +
                 "značiti kraj ljudske rase... " +
                 "Ona će se sama razvijati i " +
                 "redizajnirati " +
                 "sve bržim tempom. " +
                 "Ljudi, koji su ograničeni sporom biološkom evolucijom, " +
                 "neće moći konkurirati i bit će zamijenjeni."
    },
    {
        "id": 2,
        "author": "Claude Shannon",
        "quote": "Zamišljam vrijeme kada ćemo robotima biti ono što su " +
                 "psi ljudima, " +
                 "i navijam za strojeve."
    },
    {
        "id": 3,
        "author": "Elon Musk",
        "quote": "Brzina napredovanja u umjetnoj inteligenciji " +
                 "(ne mislim na usku AI) " +
                 "je nevjerojatno brza. Ako nemate izravan " +
                 "kontakt s grupama poput Deepminda, " +
                 "nemate pojma koliko brzo — raste " +
                 "brzinom bliskom eksponencijalnoj. " +
                 "Rizik od nečega ozbiljno opasnog " +
                 "se događa u petogodišnjem okviru." +
                 "Najviše 10 godina."
    },
    {
        "id": 4,
        "author": "Geoffrey Hinton",
        "quote": "Uvijek sam bio uvjeren da je jedini način " +
                 "da umjetna inteligencija funkcionira " +
                 "da se računanje vrši na način sličan ljudskom mozgu. " +
                 "To je cilj kojem težim. Napredujemo, " +
                 "iako još uvijek imamo puno za naučiti o " +
                 "točnom načinu funkcioniranja mozga."
    },
    {
        "id": 5,
        "author": "Pedro Domingos",
        "quote": "Ljudi se brinu da će računala " +
                 "postati preinteligentna i zavladati svijetom, " +
                 "ali pravi problem je u tome što su preglupa " +
                 "i već su zavladala svijetom."
    },
    {
        "id": 6,
        "author": "Alan Turing",
        "quote": "Čini se vjerojatnim da kada jednom počne metoda " +
                 "računanja putem stroja, neće proći dugo " +
                 "da nadmaše naše slabe sposobnosti... " +
                 "Moći će međusobno razgovarati " +
                 "kako bi izoštrili svoje umove. " +
                 "U nekom trenutku, stoga, trebali bismo " +
                 "očekivati da strojevi preuzmu kontrolu."
    },
    {
        "id": 7,
        "author": "Ray Kurzweil",
        "quote": "Umjetna inteligencija će doseći " +
                 "ljudske razine oko 2029. " +
                 "Ako to pratite dalje, recimo, do 2045. godine, " +
                 "množit ćemo inteligenciju, " +
                 "ljudsku biološku mašinsku inteligenciju " +
                 "naše civilizacije milijardu puta."
    },
    {
        "id": 8,
        "author": "Sebastian Thrun",
        "quote": "Nitko to ne izlaže na ovaj način, ali mislim " +
                 "da je umjetna inteligencija " +
                 "gotovo disciplina humanistike. To je zapravo pokušaj " +
                 "da se razumije ljudska inteligencija i ljudska spoznaja."
    },
    {
        "id": 9,
        "author": "Andrew Ng",
        "quote": "Radimo ovu analognu usporedbu da je AI nova električna energija." +
                 "Električna energija je transformirala industrije: poljoprivredu, " +
                 "transport, komunikaciju, proizvodnju."
    }
]

Sada je potrebno stvoriti resursnu klasu Quote koja će definirati operacije krajnjih točaka našeg API-ja. Unutar klase treba deklarirati četiri metode: get, post, put, delete.

Započnimo s metodom GET

Ona omogućava dobivanje određene citate upisivanjem njenog ID-a ili slučajne citate ako ID nije 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 vraća slučajnu citatu ako ID sadrži zadanu vrijednost, tj. kada metoda nije pozvana s zadanim ID-em.

Ako je zadana, metoda pretražuje citate i nalazi onaj koji sadrži zadan ID. Ako ništa nije pronađeno, ispisuje poruku “Quote not found, 404”.

Zapamtite: metoda vraća HTTP status 200 u slučaju uspješnog zahtjeva i 404 ako zapis nije pronađen.

Sada stvorimo POST metodu za dodavanje nove citate u repozitorij.

Ona će primiti identifikator svake nove citate prilikom unosa. Osim toga, POST će koristiti reqparse za parsiranje parametara koji će biti u tijelu zahtjeva (autor i 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

U gornjem kodu POST metoda prihvatila je ID citate. Zatim, uz pomoć reqparse, dobila je autora i citatu iz zahtjeva, čuvajući ih u rječniku params.

Ako citata s navedenim ID-om već postoji, metoda ispisuje odgovarajuću poruku i kod 400.

Ako citata s navedenim ID-om još nije bila stvorena, metoda stvara novi zapis s navedenim ID-om i autorom, kao i drugim parametrima. Potom dodaje zapis u popis ai_quotes i vraća zapis s novom citatom zajedno s kodom 201.

Sada kreiramo PUT metodu za izmjenu postojećih citata u 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

PUT metoda, poput prethodnog primjera, uzima ID i ulazne podatke te parsira parametre citata koristeći reqparse.

Ako citat s navedenim ID-jem postoji, metoda će ga ažurirati novim parametrima, a zatim će prikazati ažurirani citat sa statusom 200. Ako citat s navedenim ID-jem još ne postoji, stvorit će se nova stavka s statusom 201.

Na kraju, kreirajmo DELETE metodu za uklanjanje citata koji više ne inspirira.

def delete(self, id):
      global ai_quotes
      ai_quotes = [quote for quote in ai_quotes if quote["id"] != id]
      return f"Citat s ID-jem {id} je obrisan.", 200

Ova metoda prima ID citata kao unos i ažurira popis ai_quotes koristeći globalnu listu.

Sada, kada smo stvorili sve metode, sve što trebamo je dodati resurs u API, definirati putanju i pokrenuti Flask.

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

Naša REST API usluga je spremna!

Nakon toga možemo spremiti kod u datoteku app.py i pokrenuti je u konzoli pomoću naredbe:

python3 app.py

Ako je sve u redu, dobit ćemo nešto poput ovog:

* Debug mode: uključen
* Pokreće se na 127.0.0.1:5000\/ (Pritisnite CTRL+C za izlaz)
* Ponovno pokretanje sa stat
* Debugger je aktivan!
* Debugger PIN: XXXXXXX

Testiramo API

Nakon što je API stvoren, potrebno ga je testirati.

To se može učiniti pomoću konzolne alatke curl ili klijenta Insomnia REST, ili objavljivanjem API-ja na Rapid API.

Pisanje API-ja u Pythonu (s Flask i RapidAPI)

Objavljujemo naš API

RapidAPI je najveća svjetska trgovina s više od 10 000 API-ja (i oko 1 milijun programera).

RapidAPI ne samo da pruža jedinstveno sučelje za rad s vanjskim API-ima, već omogućava brzo i jednostavno objavljivanje vašeg vlastitog API-ja.

Da biste da učinite to, prvo ga treba objaviti na nekom serveru na mreži. U našem slučaju koristit ćemo Heroku. Rad s njim ne bi trebao predstavljati nikakve poteškoće, (više o njemu možete saznati ovdje).

Kako objaviti svoj API na Heroku

1. Instaliramo Heroku.

Prvo se treba registrirati i instalirati Heroku Command Line Interface (CLI). Ovo radi na Ubuntu 16+.

sudo snap install heroku —classic

Zatim se prijavljujemo:

heroku login

2. Dodajemo potrebne datoteke.

Sada treba dodati datoteke za objavljivanje u mapu u našem aplikaciji:

  • requirements.txt sa popisom potrebnih Python modula;
  • Procfile koji ukazuje koje se naredbe trebaju izvršiti za pokretanje aplikacije;
  • .gitignore — za isključivanje datoteka koje nisu potrebne na serveru.

Datoteka requirements.txt će sadržavati sljedeće retke:

  • flask
  • flask-restful
  • gunicorn

Molimo vas da obratite pažnju: dodali smo gunicorn (Python WSGI HTTP Server) na listu, jer trebamo pokrenuti našu aplikaciju na serveru.

Procfile će sadržavati:

web: gunicorn app:app

Sadržaj .gitignore:

*.pyc
__pycache__/

Sada kada su datoteke stvorene, hajde da inicijaliziramo git repozitorij i napravimo commit:

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

3. Kreiramo novu Heroku aplikaciju.

heroku create

Šaljemo master branch u udaljeni Heroku repozitorij:

git push heroku master

Sada možemo početi otvaranjem API servisa pomoću komandi:

heroku ps:scale web=1
heroku open
 

API će biti dostupan na adresi your-random-heroku-name.herokuapp.com/ai-quotes.

Kako dodati vaš Python API na RapidAPI tržište

Nakon što je API servis objavljen na Heroku, možete ga dodati na Rapid API. Ovdje je detaljna dokumentacija o ovoj temi.

1. Kreirajte RapidAPI račun.

Pisanje API-ja u Pythonu (s Flask i RapidAPI)

Registrirajte besplatni račun — to možete učiniti pomoću Facebooka, Googlea ili GitHub-a.

Pisanje API-ja u Pythonu (s Flask i RapidAPI)

2. Dodajte API u kontrolnu ploču.

Pisanje API-ja u Pythonu (s Flask i RapidAPI)

3. Zatim unesite opće informacije o svom API-ju.

Pisanje API-ja u Pythonu (s Flask i RapidAPI)

4. Nakon što kliknete "Add API", pojavit će se nova stranica gdje možete unijeti informacije o našem API-ju.

Pisanje API-ja u Pythonu (s Flask i RapidAPI)

5. Sada možete ili ručno unijeti endpoint-e API-ja, ili učitati swagger-datoteku pomoću OpenAPI-ja.

Pisanje API-ja u Pythonu (s Flask i RapidAPI)

Sada trebate odrediti endpoint-e našeg API-ja na stranici Endpointi. U našem slučaju, endpoint-i odgovaraju konceptu CRUD (get, post, put, delete).

Pisanje API-ja u Pythonu (s Flask i RapidAPI)

Dalje, trebate stvoriti GET AI Quote endpoint koji vraća nasumičnu citat (u slučaju da je ID zadani) ili citat za određeni ID.

Za izradu endpoint-a kliknite gumb "Create Endpoint".

Pisanje API-ja u Pythonu (s Flask i RapidAPI)

Ponovite ovaj proces za sve ostale endpoint-e API-ja. To je to! Čestitam, objavili ste svoj API!

Ako je sve u redu, stranica API-ja izgledat će ovako:

Pisanje API-ja u Pythonu (s Flask i RapidAPI)

Zaključak

U ovom članku istražili smo proces izrade vlastitog RESTful API servisa na Pythonu, zajedno s procesom objavljivanja API-ja u oblaku Heroku i dodavanja u katalog RapidAPI.

No, u testnoj verziji prikazani su samo osnovni principi razvoja API-ja — nijanse poput sigurnosti, otpornosti i skalabilnosti nisu razmatrane.

Pri razvoju stvarnog API-ja sve to treba uzeti u obzir.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster