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

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

Ako čitate ovaj članak, vjerovatno ste već upoznati s mogućnostima koje dolaze s korištenjem API-ja (Aplikacijski programski interfejs).

Dodavanjem jednog od mnogih otvorenih API-ja vašoj aplikaciji možete proširiti funkcionalnost aplikacije ili je obogatiti potrebnim podacima. Ali šta ako ste razvili jedinstvenu funkciju koju želite podijeliti sa zajednicom?

Odgovor je jednostavan: trebate kreirajte svoj vlastiti API.

Iako ovo može izgledati kao težak zadatak u početku, zapravo je jednostavan. Pokazat ćemo vam kako to učiniti koristeći Python.

Šta vam je potrebno za početak

Za razvoj API-ja potrebno je:

  • Python3;
  • boca — jednostavan i lak za korištenje okvir za kreiranje web aplikacija;
  • Flask-RESTful je proširenje za Flask koje vam omogućava da brzo i uz minimalnu konfiguraciju razvijete REST API.

Instalacija se vrši naredbom:

pip install flask-restful

Za početnike preporučujemo besplatno intenzivno programiranje:
Razvoj telegram bota u C# — 26–28. avgusta. Besplatni intenzivni kurs koji vam omogućava da shvatite kako rade botovi pomoćnici, specifičnosti rada sa Telegram API-jem i druge nijanse. Tri najbolja učesnika dobiće 30 rubalja od Skillbox-a.

Prije nego pocnete

Mi ćemo razviti RESTful API sa osnovnim CRUID funkcionalnost.

Da bismo u potpunosti razumjeli zadatak, razumijemo dva gore navedena pojma.

Šta je REST?

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

REST API-ji moraju ispunjavati određene kriterije:

  • Arhitektura klijent-server: Klijent je u interakciji sa korisničkim interfejsom, a server u interakciji sa pozadinom i skladištem podataka. Klijent i server su nezavisni, bilo koji od njih se može zameniti odvojeno od drugog.
  • Bez državljanstva - na serveru se ne pohranjuju podaci o klijentu. Stanje sesije je pohranjeno na strani klijenta.
  • Mogućnost keširanja – Klijenti mogu keširati odgovore servera kako bi poboljšali ukupne performanse.

Šta je CRUD?

RAW je koncept programiranja koji opisuje četiri osnovne akcije (kreiranje, čitanje, ažuriranje i brisanje).

U REST API-ju, tipovi zahtjeva i metode zahtjeva su odgovorni za radnje kao što su objavljivanje, preuzimanje, stavljanje, brisanje.

Sada kada razumijemo osnovne pojmove, možemo početi kreirati API.

Razvoj

Hajde da napravimo repozitorijum citata o veštačkoj inteligenciji. AI je jedna od najbrže rastućih tehnologija danas, a Python je popularan alat za rad s AI.

Sa ovim API-jem, Python programer može brzo dobiti informacije o AI-u i biti inspiriran novim napretkom. Ako programer ima vrijedne misli o ovoj temi, moći će ih dodati u spremište.

Počnimo s uvozom potrebnih modula i postavljanjem Flask-a:

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

U ovom isječku, Flask, Api i Resource su klase koje su nam potrebne.

Reqparse je Flask-RESTful interfejs za raščlanjivanje upita... Takođe će vam trebati nasumični modul da prikažete nasumični citat.

Sada ćemo kreirati spremište citata o AI.

Svaki repo unos će sadržavati:

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

Pošto je ovo samo primjer za obuku, sve unose ćemo pohraniti u Python listu. U stvarnoj aplikaciji, vjerovatno bismo umjesto toga koristili bazu podataka.

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

Sada moramo kreirati klasu resursa Quote koja će definirati operacije naših krajnjih tačaka API-ja. Unutar klase morate deklarirati četiri metode: get, post, put, delete.

Počnimo sa GET metodom

Omogućava da se dobije specifična ponuda navođenjem njenog ID-a ili nasumični citat 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 nasumični citat ako ID sadrži zadanu vrijednost, tj. nije naveden ID prilikom pozivanja metode.

Ako je specificirano, tada metoda pretražuje među citatima i pronalazi onaj koji sadrži navedeni ID. Ako ništa nije pronađeno, prikazuje se poruka “Cuote not found, 404”.

Zapamtite: metoda vraća HTTP status 200 ako je zahtjev bio uspješan i 404 ako zapis nije pronađen.

Sada kreirajmo POST metodu za dodavanje novog citata u spremište

Dobit će ID svakog novog citata dok kucate. Osim toga, POST će koristiti reqparse za raščlanjivanje parametara koji će ući u tijelo zahtjeva (autor i tekst citata).

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 kodu iznad, POST metoda je prihvatila ID citata. Zatim, koristeći reqparse, preuzima autora i citat iz upita, pohranjujući ih u rječnik params.

Ako ponuda sa navedenim ID-om već postoji, metoda prikazuje odgovarajuću poruku i kod 400.

Ako citat sa navedenim ID-om još nije kreiran, metoda kreira novi zapis sa navedenim ID-om i autorom, kao i drugim parametrima. Zatim dodaje unos na listu ai_quotes i vraća unos sa novim citatom zajedno sa 201 kodom.

Sada kreiramo metodu PUT za promjenu postojećeg citata u spremištu

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, slično prethodnom primjeru, uzima ID i ulaz i analizira parametre citata koristeći reqparse.

Ako citat sa navedenim ID-om postoji, metoda će ga ažurirati novim parametrima, a zatim će ispisati ažurirani citat sa kodom 200. Ako još nema citata sa navedenim ID-om, kreirat će se novi zapis sa kodom 201.

Na kraju, napravimo metodu DELETE za uklanjanje citata koji više nije inspirativan

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

Ova metoda dobija ID citata kao ulaz i ažurira listu ai_quotes koristeći dijeljenu listu.

Sada kada smo kreirali sve metode, sve što trebamo učiniti je jednostavno dodati resurs API-ju, postaviti putanju i pokrenuti Flask.

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

Naša REST API usluga je spremna!

Zatim možemo sačuvati kod u app.py datoteku tako što ćemo ga pokrenuti na konzoli koristeći naredbu:

python3 app.py

Ako je sve u redu, onda ćemo dobiti nešto ovako:

* Režim za otklanjanje grešaka: uključen
*Trčanje dalje 127.0.0.1:5000/ (Pritisnite CTRL+C za izlaz)
* Ponovno pokretanje sa stat
* Debugger je aktivan!
* PIN za otklanjanje grešaka: XXXXXXX

Testiranje API-ja

Kada je API kreiran, potrebno ga je testirati.

Ovo se može učiniti pomoću uslužnog programa Curl konzole ili Insomnia REST klijenta, ili objavljivanjem API-ja na Rapid API-ju.

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

Objavljivanje našeg API-ja

RapidAPI je najveće svetsko tržište sa više od 10 API-ja (i oko milion programera).

RapidAPI ne samo da pruža jedno sučelje za rad sa API-jima trećih strana, već vam daje i mogućnost brzog i jednostavnog objavljivanja vlastitog API-ja.

Da bi učini to, prvo ga trebate objaviti na nekom serveru na mreži. U našem slučaju ćemo koristiti Heroku. Rad s njim ne bi trebao uzrokovati poteškoće, (možete saznati više o njemu ovdje).

Kako objaviti svoj API na Heroku-u

1. Instalirajte Heroku.

Prvi korak je registracija i instaliranje Heroku interfejsa komandne linije (CLI). Ovo radi na Ubuntu 16+.

sudo snap install heroku —classic

Zatim se prijavite:

heroku login

2. Dodajte potrebne datoteke.

Sada moramo dodati fajlove za objavljivanje u folder u našoj aplikaciji:

  • Zahtevi.txt sa listom potrebnih Python modula;
  • Procfile, koji specificira koje naredbe moraju biti izvršene da bi se pokrenula aplikacija;
  • .gitignore - za isključivanje datoteka koje nisu potrebne na serveru.

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

  • flask
  • odmarati se
  • gunicorn

Imajte na umu da smo dodali gunicorn (Python WSGI HTTP server) na listu jer trebamo pokrenuti našu aplikaciju na serveru.

Profil će sadržavati:

web: gunicorn app:app

Sadržaj .gitignore:

*.pyc
__pycache__/

Sada kada su fajlovi kreirani, hajde da inicijalizujemo git repo i urezujemo:

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

3. Kreirajte novu Heroku aplikaciju.

heroku create

Guramo glavnu granu u udaljeni Heroku repo:

git push heroku master

Sada možete započeti otvaranjem API usluge pomoću naredbi:

heroku ps:scale web=1
heroku open
 

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

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

Kada se vaša API usluga objavi na Heroku-u, možete je dodati u Rapid API. Evo detaljna dokumentacija na ovu temu.

1. Kreirajte RapidAPI nalog.

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

Registrujte besplatni nalog - to možete učiniti koristeći Facebook, Google, GitHub.

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

2. Dodajte API na kontrolni panel.

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

3. Zatim unesite općenite informacije o vašem API-ju.

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

4. Nakon klika na “Dodaj API” pojavljuje se nova stranica na kojoj možete unijeti informacije o našem API-ju.

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

5. Sada možete ručno unijeti API krajnje tačke ili preuzeti swagger-file koristeći OpenAPI.

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

Pa, sada moramo postaviti krajnje tačke našeg API-ja na stranici Krajnje tačke. U našem slučaju, krajnje tačke odgovaraju konceptu CRUD-a (dobi, objavi, stavi, izbriši).

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

Zatim morate kreirati krajnju točku GET AI Quote koja prikazuje nasumični citat (ako je ID zadani) ili citat za navedeni ID.

Da biste kreirali krajnju tačku, kliknite na dugme „Kreiraj krajnju tačku“.

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

Ponavljamo ovaj proces za sve ostale krajnje tačke API-ja. To je sve! Čestitamo, objavili ste svoj API!

Ako je sve u redu, API stranica će izgledati otprilike ovako:

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

zaključak

U ovom članku naučili smo proces kreiranja vlastite RESTful API usluge u Pythonu, zajedno s procesom objavljivanja API-ja u Heroku oblaku i dodavanjem u RapidAPI direktorij.

Ali testna verzija je pokazala samo osnovne principe razvoja API-ja - nijanse poput sigurnosti, tolerancije grešaka i skalabilnosti nisu uzete u obzir.

Prilikom razvoja pravog API-ja, sve ovo treba uzeti u obzir.

izvor: www.habr.com

Dodajte komentar