Pisanje API-ja v Pythonu (s Flaskom in RapidAPI)

Pisanje API-ja v Pythonu (s Flaskom in RapidAPI)

Če berete ta članek, ste verjetno že seznanjeni z možnostmi, ki jih prinaša uporaba API-ja (Application Programming Interface).

Z dodajanjem enega od številnih odprtih API-jev vaši aplikaciji lahko razširite funkcionalnost aplikacije ali jo obogatite s potrebnimi podatki. Kaj pa, če ste razvili edinstveno funkcijo, ki jo želite deliti s skupnostjo?

Odgovor je preprost: potrebujete ustvarite svoj API.

Čeprav se to na prvi pogled morda zdi težka naloga, je pravzaprav preprosta. Pokazali vam bomo, kako to storite s Pythonom.

Kaj potrebujete za začetek

Za razvoj API-ja potrebujete:

  • Python 3;
  • Bučko — preprosto in za uporabo enostavno ogrodje za ustvarjanje spletnih aplikacij;
  • Flask-RESTful je razširitev za Flask, ki vam omogoča hitro in z minimalno konfiguracijo razviti REST API.

Namestitev izvedemo z ukazom:

pip install flask-restful

Za začetnike priporočamo brezplačen intenzivni tečaj programiranja:
Razvoj Telegram bota v C# — 26.–28. avgusta. Brezplačen intenzivni tečaj, ki vam omogoča, da razumete, kako delujejo pomočniki, posebnosti dela z API-jem Telegram in druge nianse. Trije najboljši udeleženci bodo prejeli 30 rubljev od Skillboxa.

Preden začnete

Razvili bomo RESTful API z osnovnim Funkcionalnost CRUID.

Da bi v celoti razumeli nalogo, poglejmo zgoraj omenjena izraza.

Kaj je REST?

REST API (Representational State Transfer) je API, ki za izmenjavo podatkov uporablja zahteve HTTP.

API-ji REST morajo izpolnjevati določena merila:

  • Arhitektura odjemalec-strežnik: odjemalec sodeluje z uporabniškim vmesnikom, strežnik pa z zaledjem in shrambo podatkov. Odjemalec in strežnik sta neodvisna, katerega koli od njiju je mogoče zamenjati ločeno od drugega.
  • Brez stanja – na strežniku niso shranjeni nobeni podatki o odjemalcih. Stanje seje je shranjeno na strani odjemalca.
  • Predpomnilnik – odjemalci lahko predpomnijo odzive strežnika za izboljšanje splošne zmogljivosti.

Kaj je CRUD?

DROBEN je koncept programiranja, ki opisuje štiri osnovna dejanja (ustvari, preberi, posodobi in izbriši).

V API-ju REST so vrste zahtev in metode zahtev odgovorne za dejanja, kot so objava, pridobivanje, dajanje, brisanje.

Zdaj, ko razumemo osnovne izraze, lahko začnemo ustvarjati API.

Razvoj

Ustvarimo skladišče citatov o umetni inteligenci. AI je danes ena najhitreje rastočih tehnologij in Python je priljubljeno orodje za delo z AI.

S tem API-jem lahko razvijalec Pythona hitro pridobi informacije o umetni inteligenci in se navdihne za nove dosežke. Če ima razvijalec dragocene misli o tej temi, jih bo lahko dodal 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 izrezku so Flask, Api in Resource razredi, ki jih potrebujemo.

Reqparse je vmesnik za razčlenjevanje poizvedb Flask-RESTful ... Potrebovali boste tudi naključni modul za prikaz naključnega citata.

Zdaj bomo ustvarili repozitorij citatov o AI.

Vsak repo vnos bo vseboval:

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

Ker je to le primer za usposabljanje, bomo vse vnose shranili na seznam Python. V resnični aplikaciji bi verjetno namesto tega uporabili bazo podatkov.

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

Zdaj moramo ustvariti razred vira Quote, ki bo definiral delovanje naših končnih točk API-ja. Znotraj razreda morate deklarirati štiri metode: get, post, put, delete.

Začnimo z metodo GET

Omogoča pridobitev določenega predračuna z navedbo njegovega ID-ja ali naključnega predračuna, č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čni citat, če ID vsebuje privzeto vrednost, tj. pri klicu metode ni bil podan noben ID.

Če je naveden, potem metoda išče med citati in najde tistega, ki vsebuje navedeni ID. Če ni najdeno nič, se prikaže sporočilo »Citat ni bil najden, 404«.

Ne pozabite: metoda vrne status HTTP 200, če je zahteva uspešna, in 404, če zapis ni najden.

Zdaj pa ustvarimo metodo POST za dodajanje novega citata v repozitorij

Med tipkanjem bo dobil ID vsakega novega citata. Poleg tega bo POST uporabil reqparse za razčlenitev parametrov, ki bodo šli v telo zahteve (avtor in besedilo 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

V zgornji kodi je metoda POST sprejela ID ponudbe. Nato je z uporabo reqparse iz poizvedbe pridobil avtorja in citat ter ju shranil v slovar params.

Če ponudba z navedenim ID-jem že obstaja, metoda prikaže ustrezno sporočilo in kodo 400.

Če navedba z navedenim ID-jem še ni bila ustvarjena, metoda ustvari nov zapis z navedenim ID-jem in avtorjem ter drugimi parametri. Nato doda vnos na seznam ai_quotes in vrne vnos z novim citatom skupaj s kodo 201.

Zdaj ustvarimo metodo PUT za spremembo obstoječe ponudbe 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 vnos ter razčleni parametre ponudbe z uporabo reqparse.

Če navedba s podanim ID-jem obstaja, jo bo metoda posodobila z novimi parametri in nato izpisala posodobljeno navedbo s kodo 200. Če navedbe s podanim ID-jem še ni, bo ustvarjen nov zapis s kodo 201.

Nazadnje ustvarimo metodo DELETE za odstranitev citata, ki ni več navdihujoč

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

Ta metoda dobi ID ponudbe kot vhod in posodobi seznam ai_quotes s seznamom v skupni rabi.

Zdaj, ko smo ustvarili vse metode, moramo samo dodati vir v API, nastaviti pot in zagnati Flask.

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

Naša storitev REST API je pripravljena!

Nato lahko kodo shranimo v datoteko app.py tako, da jo zaženemo v konzoli z ukazom:

python3 app.py

Če je vse v redu, bomo dobili nekaj takega:

* Način odpravljanja napak: vklopljen
*Teče naprej 127.0.0.1:5000/ (Pritisnite CTRL+C za izhod)
* Ponovni zagon s stat
* Razhroščevalnik je aktiven!
* PIN razhroščevalnika: XXXXXXX

Testiranje API-ja

Ko je API ustvarjen, ga je treba preizkusiti.

To lahko storite s pripomočkom konzole curl ali odjemalcem Insomnia REST ali z objavo API-ja na Rapid API.

Pisanje API-ja v Pythonu (s Flaskom in RapidAPI)

Objavljanje našega API-ja

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

RapidAPI ne zagotavlja le enotnega vmesnika za delo z API-ji tretjih oseb, temveč vam omogoča tudi hitro in enostavno objavo lastnega API-ja.

Da naredi, ga morate najprej objaviti na nekem 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. Namestite Heroku.

Prvi korak je registracija in namestitev vmesnika ukazne vrstice Heroku (CLI). To deluje na Ubuntu 16+.

sudo snap install heroku —klasična

Nato se prijavite:

heroku prijava

2. Dodajte potrebne datoteke.

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

  • requirements.txt s seznamom zahtevanih modulov Python;
  • 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:

  • bučko
  • bučka-mirna
  • gunicorn

Upoštevajte, da smo na seznam dodali gunicorn (Python WSGI HTTP Server), ker moramo našo aplikacijo zagnati na strežniku.

Profil bo vseboval:

splet: gunicorn app:app

Vsebina .gitignore:

*.pyc
__pycache__/

Zdaj, ko so datoteke ustvarjene, inicializirajmo repo git in izdajmo:

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

3. Ustvarite novo aplikacijo Heroku.

heroku create

Glavno vejo potisnemo v oddaljeni repo Heroku:

git push heroku master

Zdaj lahko začnete tako, da odprete storitev API z ukazi:

heroku ps:scale web=1
heroku open
 

API bo na voljo na vaše-naključno-ime-junaka.herokuapp.com/ai-quotes.

Kako dodati svoj Python API na tržnico RapidAPI

Ko je vaša storitev API objavljena na Heroku, jo lahko dodate v Rapid API. Tukaj podrobno dokumentacijo na to temo.

1. Ustvarite račun RapidAPI.

Pisanje API-ja v Pythonu (s Flaskom in RapidAPI)

Registrirajte brezplačen račun – to lahko storite s Facebookom, Googlom, GitHubom.

Pisanje API-ja v Pythonu (s Flaskom in RapidAPI)

2. Dodajte API na nadzorno ploščo.

Pisanje API-ja v Pythonu (s Flaskom in RapidAPI)

3. Nato vnesite splošne informacije o svojem API-ju.

Pisanje API-ja v Pythonu (s Flaskom in RapidAPI)

4. Ko kliknete »Dodaj API«, se prikaže nova stran, kjer lahko vnesete informacije o našem API-ju.

Pisanje API-ja v Pythonu (s Flaskom in RapidAPI)

5. Zdaj lahko ročno vnesete končne točke API ali prenesete swagger-datoteka z uporabo OpenAPI.

Pisanje API-ja v Pythonu (s Flaskom in RapidAPI)

No, zdaj moramo nastaviti končne točke našega API-ja na strani Končne točke. V našem primeru končne točke ustrezajo konceptu CRUD (get, post, put, delete).

Pisanje API-ja v Pythonu (s Flaskom in RapidAPI)

Nato morate ustvariti končno točko GET AI Quote, ki prikazuje naključno ponudbo (če je ID privzet) ali ponudbo za navedeni ID.

Če želite ustvariti končno točko, kliknite gumb »Ustvari končno točko«.

Pisanje API-ja v Pythonu (s Flaskom in RapidAPI)

Ta postopek ponovimo za vse druge končne točke API-ja. To je vse! Čestitamo, objavili ste svoj API!

Če je vse v redu, bo stran API videti nekako takole:

Pisanje API-ja v Pythonu (s Flaskom in RapidAPI)

Zaključek

V tem članku smo se naučili postopka ustvarjanja lastne storitve API RESTful v Pythonu, skupaj s postopkom objave API-ja v oblaku Heroku in njegovega dodajanja v imenik RapidAPI.

Toda testna različica je pokazala le osnovna načela razvoja API - nianse, kot so varnost, toleranca napak in razširljivost, niso bile upoštevane.

Pri razvoju pravega API-ja je treba vse to upoštevati.

Vir: www.habr.com

Dodaj komentar