API kirjutamine Pythonis (koos Flaski ja RapidAPI-ga)

API kirjutamine Pythonis (koos Flaski ja RapidAPI-ga)

Kui loed seda artiklit, siis oled ilmselt juba kursis võimalustega, mis API (Application Programming Interface) kasutamisel avanevad.

Lisades oma rakendusele ühe paljudest avalikest API-dest, saate laiendada selle rakenduse funktsionaalsust või täiendada seda vajalike andmetega. Aga mis siis, kui olete välja töötanud ainulaadse funktsiooni, mida soovite kogukonnaga jagada?

Vastus on lihtne: vajate looge oma API.

Kuigi see võib alguses tunduda hirmutav ülesanne, on see tegelikult üsna lihtne. Näitame teile, kuidas seda Pythoniga teha.

Mida on vaja alustamiseks

API arendamine nõuab:

  • Python3;
  • Kolb — lihtne ja hõlpsasti kasutatav raamistik veebirakenduste loomiseks;
  • Kolb-puhakas on Flask'i laiendus, mis võimaldab kiiresti ja minimaalse konfiguratsiooniga välja töötada REST API.

Installimine toimub käsuga:

pip install flask-restful

Soovitame algajatele tasuta intensiivprogrammeerimist:
Telegrami roboti arendamine C#-s — 26.–28. august. Tasuta intensiivne, mis võimaldab teil mõista, kuidas abibotid töötavad, Telegram API-ga töötamise funktsioonid ja muud nüansid. Kolm parimat saavad Skillboxilt 30 000 rubla.

Enne kui alustad

Me töötame välja RESTful API koos põhilise CRUID funktsionaalsus.

Ülesande täielikuks mõistmiseks mõistame kahte ülalnimetatud terminit.

Mis on REST?

REST API (Representational State Transfer) on API, mis kasutab andmete vahetamiseks HTTP päringuid.

REST API-d peavad vastama teatud kriteeriumidele:

  • Klient-server arhitektuur: klient suhtleb kasutajaliidesega ning server suhtleb taustaprogrammi ja andmesalvestiga. Klient ja server on sõltumatud, ükskõik millist neist saab teisest eraldi asendada.
  • Stateless – serverisse ei salvestata kliendiandmeid. Seansi olek salvestatakse kliendi poolel.
  • Vahemälu – kliendid saavad serveri vastuseid vahemällu salvestada, et parandada üldist jõudlust.

Mis on CRUD?

TOOR on programmeerimiskontseptsioon, mis kirjeldab nelja põhitoimingut (loomine, lugemine, värskendamine ja kustutamine).

REST API-s vastutavad päringutüübid ja taotlusmeetodid selliste toimingute eest nagu postitamine, hankimine, panemine, kustutamine.

Nüüd, kui oleme põhitingimustega tegelenud, võime alustada API loomist.

Areng

Loome tehisintellekti puudutavate tsitaatide hoidla. AI on tänapäeval üks kiiremini kasvavaid tehnoloogiaid ja Python on populaarne tööriist tehisintellektiga töötamiseks.

Selle API abil saab Pythoni arendaja kiiresti tehisintellekti tundma õppida ja saada inspiratsiooni uutest saavutustest. Kui arendajal on sellel teemal väärtuslikke mõtteid, saab ta need hoidlasse lisada.

Alustame vajalike moodulite importimisest ja Flaski seadistamisest:

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

Selles väljavõttes on meile vajalikud klassid Flask, Api ja Resource.

Reqparse on Flask-RESTful päringu parsimise liides... Juhusliku hinnapakkumise kuvamiseks on vaja ka juhuslikku moodulit.

Nüüd loome AI kohta tsitaatide hoidla.

Iga repo kirje sisaldab:

  • digitaalne ID;
  • tsitaadi autori nimi;
  • tsitaat.

Kuna see on vaid õppenäide, salvestame kõik kirjed Pythoni loendisse. Reaalses rakenduses kasutaksime suure tõenäosusega selle asemel andmebaasi.

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

Nüüd peame looma ressursiklassi Quote, mis määratleb meie API lõpp-punktide toimingud. Klassi sees tuleb deklareerida neli meetodit: hanki, postita, pane, kustuta.

Alustame GET-meetodiga

See võimaldab teil saada konkreetse hinnapakkumise, määrates selle ID, või juhusliku hinnapakkumise, kui ID-d pole määratud.

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

Meetod GET tagastab juhusliku hinnapakkumise, kui ID sisaldab vaikeväärtust, st. Meetodi kutsumisel ID-d ei määratud.

Kui see on määratud, otsib meetod jutumärkide hulgast ja leiab selle, mis sisaldab antud ID-d. Kui midagi ei leita, kuvatakse teade "Tsitaat ei leitud, 404".

Pidage meeles, et meetod tagastab HTTP-oleku 200, kui päring oli edukas, ja 404, kui kirjet ei leitud.

Nüüd loome POST-meetodi hoidlasse uue hinnapakkumise lisamiseks

See saab iga uue hinnapakkumise ID sisestamise ajal. Lisaks kasutab POST reqparse'i parameetrite sõelumiseks, mis lähevad päringu kehasse (autori ja tsitaadi tekst).

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

Ülaltoodud koodis aktsepteeris POST-meetod hinnapakkumise ID-d. Seejärel otsis see reqparse'i abil päringust autori ja tsitaadi, salvestades need parameetrite sõnastikku.

Kui määratud ID-ga tsitaat on juba olemas, kuvab meetod vastava teate ja koodi 400.

Kui määratud ID-ga tsitaat pole veel loodud, loob meetod uue kirje määratud ID ja autoriga ning muude parameetritega. Seejärel lisab see kirje ai_quotes loendisse ja tagastab kirje uue hinnapakkumisega koos koodiga 201.

Nüüd loome hoidlas olemasoleva hinnapakkumise muutmiseks PUT-meetodi

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-meetod võtab sarnaselt eelmisele näitele ID ja sisendi ning analüüsib hinnapakkumise parameetreid reqparse abil.

Kui määratud ID-ga pakkumine on olemas, värskendab meetod seda uute parameetritega ja seejärel väljastab värskendatud hinnapakkumise koodiga 200. Kui määratud ID-ga hinnapakkumist veel pole, luuakse uus kirje koodiga 201.

Lõpuks loome DELETE meetodi, et eemaldada tsitaat, mis ei ole enam inspireeriv.

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

See meetod võtab sisendiks hinnapakkumise ID ja värskendab jagatud loendi abil ai_tsitaatide loendit.

Nüüd, kui oleme kõik meetodid loonud, on meil vaja lihtsalt ressurss API-le lisada, määrata tee ja käivitada Flask.

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

Meie REST API teenus on valmis!

Järgmisena saame koodi salvestada faili app.py, käivitades selle konsoolis käsuga:

python3 app.py

Kui kõik on korras, saame midagi sellist:

* Silumisrežiim: sees
* Jookseb edasi 127.0.0.1:5000/ (Väljumiseks vajutage CTRL+C)
* Taaskäivitamine stat
* Silur on aktiivne!
* Siluri PIN-kood: XXXXXXX

API testimine

Pärast API loomist tuleb seda testida.

Seda saab teha curl-konsooli utiliidi või Insomnia REST-kliendi abil või API avaldamisega Rapid API-s.

API kirjutamine Pythonis (koos Flaski ja RapidAPI-ga)

Meie API avaldamine

RapidAPI on üle 10 000 API-ga (ja umbes 1 miljoni arendajaga) maailma suurim turg.

RapidAPI ei paku mitte ainult ühte liidest kolmandate osapoolte API-dega töötamiseks, vaid võimaldab teil ka kiiresti ja lihtsalt oma API-d avaldada.

Kuni tee seda, peate selle esmalt mõnes võrguserveris avaldama. Meie puhul kasutame Heroku. Temaga töötamine ei tohiks tekitada raskusi, (selle kohta saad rohkem teada siit).

Kuidas avaldada oma API Herokus

1. Installige Heroku.

Esimene samm on registreerida ja installida Heroku Command Line Interface (CLI). See töötab Ubuntu 16+ puhul.

sudo snap install heroku --classic

Seejärel logime sisse:

heroku sisselogimine

2. Lisage vajalikud failid.

Nüüd peame lisama avaldatavad failid meie rakenduse kausta:

  • nõuded.txt koos nõutavate Pythoni moodulite loendiga;
  • Profiil, mis määrab, millised käsud tuleb rakenduse käivitamiseks täita;
  • .gitignore – serveris mittevajalike failide välistamiseks.

Fail nõuded.txt sisaldab järgmisi ridu:

  • kolb
  • kolb-puhakas
  • püsssarvik

Pange tähele, et oleme loendisse lisanud gunicorni (Python WSGI HTTP Server), kuna peame oma rakendust serveris käivitama.

Profiil sisaldab:

veeb: gunicorn app: app

Faili .gitignore sisu:

*.pyc
__pycache__/

Nüüd, kui failid on loodud, initsialiseerime git repo ja kinnitame:

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

3. Looge uus Heroku rakendus.

heroku create

Põhiharu lükkamine Heroku kaugreposi:

git push heroku master

Nüüd saate alustada API teenuse avamisega käskudega:

heroku ps:scale web=1
heroku open
 

API on saadaval aadressil your-random-heroku-name.herokuapp.com/ai-quotes.

Pythoni API lisamine RapidAPI turule

Kui API teenus on Herokus avaldatud, saate selle Rapid API-sse lisada. Siin üksikasjalik dokumentatsioon sellel teemal.

1. Looge RapidAPI konto.

API kirjutamine Pythonis (koos Flaski ja RapidAPI-ga)

Registreerime tasuta konto – seda saab teha Facebooki, Google’i, GitHubi abil.

API kirjutamine Pythonis (koos Flaski ja RapidAPI-ga)

2. Lisage juhtpaneelile API.

API kirjutamine Pythonis (koos Flaski ja RapidAPI-ga)

3. Järgmisena sisestage oma API kohta üldine teave.

API kirjutamine Pythonis (koos Flaski ja RapidAPI-ga)

4. Pärast nupul „Lisa API” klõpsamist ilmub uus leht, kuhu saate sisestada teavet meie API kohta.

API kirjutamine Pythonis (koos Flaski ja RapidAPI-ga)

5. Nüüd saate API lõpp-punktid käsitsi sisestada või alla laadida swagger fail kasutades OpenAPI-d.

API kirjutamine Pythonis (koos Flaski ja RapidAPI-ga)

Noh, nüüd peate lehel Endpoints määrama meie API lõpp-punktid. Meie puhul vastavad lõpp-punktid CRUD-i mõistele (hanki, postita, pane, kustuta).

API kirjutamine Pythonis (koos Flaski ja RapidAPI-ga)

Järgmiseks peate looma GET AI Quote lõpp-punkti, mis kuvab juhusliku hinnapakkumise (kui ID on vaikimisi) või määratud ID pakkumise.

Lõpp-punkti loomiseks peate klõpsama nuppu "Loo lõpp-punkt".

API kirjutamine Pythonis (koos Flaski ja RapidAPI-ga)

Kordame seda protsessi kõigi teiste API lõpp-punktide puhul. See on kõik! Õnnitleme, olete oma API avaldanud!

Kui kõik läheb hästi, näeb API leht välja umbes selline:

API kirjutamine Pythonis (koos Flaski ja RapidAPI-ga)

Järeldus

Selles artiklis käsitlesime Pythonis oma RESTful API teenuse loomise protsessi ning API avaldamist Heroku pilves ja selle lisamist RapidAPI kataloogi.

Kuid testversioonis näidati ainult API arendamise põhiprintsiipe - selliseid nüansse nagu turvalisus, veataluvus ja mastaapsus ei arvestatud.

Päris API väljatöötamisel tuleb seda kõike arvestada.

Allikas: www.habr.com

Lisa kommentaar