Kirjutame API Pythonis (Flaski ja RapidAPI-ga)

Kirjutame API Pythonis (Flaski ja RapidAPI-ga)

Kui loete seda artiklit, olete tÔenÀoliselt juba tuttav API (rakenduste programmeerimise liidese) vÔimalustega.

Lisades oma rakendusele ĂŒhe paljusid avatud API-sid, saate selle funktsionaalsust laiendada vĂ”i tĂ€iendavate andmetega tĂ€iendada. Aga mis juhtub, kui olete arendanud unikaalse funktsiooni, millest soovite kogukonnaga jagada?

Vastus on lihtne: peate looma oma API.

Kuigi see vĂ”ib alguses tunduda keeruline ĂŒlesanne, on tegelikult kĂ”ik lihtne. RÀÀgime, kuidas seda Pythoniga teha.

Mida on vaja projekti alustamiseks

API arendamiseks on vajalik:

  • Python 3;
  • Flask — lihtne ja kasutajasĂ”bralik raamistik veebirakenduste loomiseks;
  • Flask-RESTful — Flaski laiendus, mis vĂ”imaldab kiiresti ja minimaalse konfigureerimisega arendada REST API-d.

Installimine toimub kÀsuga:

pip install flask-restful

Soovitame tasuta intensiivkursust programmeerimises algajatele:
C# telegrammi roboti arendamine — 26.-28. august. Tasuta intensiivkursus, mis aitab mĂ”ista, kuidas abibotid töötavad, tutvuda Telegrami API eripĂ€radega ja muude nĂŒanssidega. Kolm parimat osalejat saavad Skillboxilt 30 000 rubla..

Enne alustamist

Kavandame arendada RESTful API pÔhifunktsionaalsusega CRUD-funktsioonid.

KĂŒsimuse tĂ€ielikuks mĂ”istmiseks vaatleme kaht eelnevalt mainitud mĂ”istet.

Mis on REST?

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

REST API-d peavad vastama teatud kriteeriumidele:

  • Kliendi-serveri arhitektuur: klient suhtleb kasutajaliidesega, server aga tagab andmebaasi ja andmete talletamise. Klient ja server on sĂ”ltumatud, mĂ”lemat vĂ”ib asendada eraldi.
  • Stateless — serveris ei hoita ĂŒhtegi kliendiandmeid. Seansi seisund sĂ€ilitatakse kliendi kĂŒlge.
  • VahemĂ€lu — kliendid saavad serveri vastuseid vahemĂ€lu salvestada, et parandada ĂŒldist jĂ”udlust.

Mis on CRUD?

CRUD — programmeerimise mĂ”isted, mis kirjeldavad nelja pĂ”hilist toimingut (create, read, update ja delete).

REST API-s vastutavad pĂ€ringute tĂŒĂŒbid ja pĂ€ringumeetodid selliste toimingute eest nagu post, get, put, delete.

NĂŒĂŒd, kui oleme pĂ”himĂ”isted selgeks saanud, saame alustada API loomist.

Arendus

Loome tsitaatide repot tehisintellekti kohta. AI on tĂ€napĂ€eval ĂŒks kiiremini arenevaid tehnoloogiaid ning Python on populaarne tööriist AI-ga töötamiseks.

Selle API abil saab Python arendaja kiiresti teavet AI kohta ja ammutada inspiratsiooni uutest saavutustest. Kui arendajal on selle teema kohta vÀÀrt mÔtteid, saab ta need repo lisada.

Alustame vajalike moodulite importimise ja Flaski seadistamisega:

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

Selles Flaski snippetis on Api ja Resource klassid, mida meil vaja on.

Reqparse on Flask-RESTful'i pÀringute parsimise liides
 Samuti on meil vajalik random moodul, et nÀidata juhuslikku tsitaati.

NĂŒĂŒd loome tehisintellekti tsitaatide repo.

Iga repo kirje sisaldab:

  • numbrilist ID-d;
  • tsitaadi autori nime;
  • tsitaati.

Kuna see on lihtsalt Ôppe nÀide, salvestame kÔik kirjed Pythonis nimekirja. Reaalses rakenduses kasutaksime tÔenÀoliselt andmebaasi.

ai_quotes = [
    {
        "id": 0,
        "author": "Kevin Kelly",
        "quote": "JÀrgmise 10 000 idufirma Àri plaanid on kergesti ennustatavad: " +
                 "VÔta X ja lisa AI."
    },
    {
        "id": 1,
        "author": "Stephen Hawking",
        "quote": "TÀieliku tehisintellekti arendamine vÔib " +
                 "tÀhendada inimkonna lÔppu
 " +
                 "See tÔuseb iseseisvalt ja projekteerib " +
                 "ennast pidevalt suureneva kiirusel. " +
                 "Inimesed, kelle areng on piiratud aeglase bioloogilise evolutsiooniga, " +
                 "ei suuda konkureerida ja jÀÀvad tahaplaanile."
    },
    {
        "id": 2,
        "author": "Claude Shannon",
        "quote": "Ma kujutan ette aega, mil me oleme robotitele nagu " +
                 "koerad inimestele, " +
                 "ja ma toetan masinaid."
    },
    {
        "id": 3,
        "author": "Elon Musk",
        "quote": "Tehisintellekti arengutempo " +
                 "(ma ei rÀÀgi kitsast AI-st) " +
                 "on ÀÀrmiselt kiire. Kui teil ei ole otsest " +
                 "kokkupuudet rĂŒhmadega nagu Deepmind, " +
                 "siis ei tead saa, kui kiiresti see — kasvab " +
                 "lÀhedal eksponentsiaalsele kiirus. " +
                 "Oht, et midagi tÔeliselt ohtlikku " +
                 "juhtuda, on viie aasta perspektiivis." +
                 "10 aastat maksimaalselt."
    },
    {
        "id": 4,
        "author": "Geoffrey Hinton",
        "quote": "Ma olen alati olnud veendunud, et ainus viis " +
                 "tehisintellekti tÔhusaks töötamiseks on " +
                 "laske arvutustel toimuda sarnaselt inimaju tööle. " +
                 "See on eesmĂ€rk, mille poole olen pĂŒĂŒelnud. Me teeme edusamme, " +
                 "kuigi me peame endiselt palju Ôppima, " +
                 "kuidas aju tegelikult töötab."
    },
    {
        "id": 5,
        "author": "Pedro Domingos",
        "quote": "Inimesed muretsevad, et arvutid saavad " +
                 "liialt nutikaks ja vĂ”tavad ĂŒle maailma, " +
                 "aga tegelik probleem on see, et nad on liiga lollid " +
                 "ja nad on juba maailma ĂŒle vĂ”tnud."
    },
    {
        "id": 6,
        "author": "Alan Turing",
        "quote": "Tundub, et on tÔenÀoline, et kui masin mÔtlemise " +
                 "meetod on alustatud, ei möödu kaua, " +
                 "kui nad ĂŒletavad meie nĂ”rgad vĂ”imed
 " +
                 "Nad oleksid vÔimelised omavahel rÀÀkima " +
                 "oma arusaamise teravdamiseks. " +
                 "MÔnes etapis peaksime siis " +
                 "ootama, et masinad vÔtavad kontrolli."
    },
    {
        "id": 7,
        "author": "Ray Kurzweil",
        "quote": "Tehisintellekt saavutab " +
                 "inimtaseme umbes 2029. aastaks. " +
                 "JĂ€tkates seda edasi, ĂŒtleme, 2045, " +
                 "oleme paljundanud intellekti, " +
                 "meie tsivilisatsiooni inimbioloogilise masina intellekti " +
                 "ĂŒhe miljardi kordselt."
    },
    {
        "id": 8,
        "author": "Sebastian Thrun",
        "quote": "Keegi ei vÀljenda seda nii, kuid ma arvan, " +
                 "et tehisintellekt " +
                 "on peaaegu humanitaarteaduse distsipliin. See on tegelikult katse " +
                 "mÔista inimintellekti ja inimkognitsiooni."
    },
    {
        "id": 9,
        "author": "Andrew Ng",
        "quote": "Me teeme seda analoogiat, et AI on uus elekter." +
                 "Elekter muutis tööstusharusid: pÔllumajandus, " +
                 "transport, kommunikatsioon, tootmine."
    }
]

NĂŒĂŒd tuleb luua ressursside klass Quote, mis mÀÀratleb meie API lĂ”pp-punktide toimingud. Klassis tuleb deklareerida neli meetodit: get, post, put, delete.

Alustame GET-meetodist

See vÔimaldab saada kindlat tsitaati, nÀidates selle ID-d, vÔi juhusliku tsitaadi, kui ID-d ei ole esitatud.

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 "Tsitaati ei leitud", 404

GET-meetod tagastab juhusliku tsitaadi, kui ID on vaikimisi vÀÀrtus, st kui meetodit kutsutakse, ei ole ID-d mÀÀratud.

Kui see on mÀÀratud, otsib meetod tsitaatide hulgast ja leiab selle, mis vastab mÀÀratud ID-le. Kui midagi ei leita, kuvatakse teade “Tsitaati ei leitud, 404”.

Pidage meeles: meetod tagastab HTTP-staatuse 200 edukate pÀringute korral ja 404, kui kirjet ei leita.

NĂŒĂŒd loome POST-meetodi, et lisada uus tsitaat registrisse

See saab iga uue tsitaadi ID sisendina. Lisaks kasutab POST reqparse'i, et analĂŒĂŒsida parameetreid, mis lĂ€hevad pĂ€ringu kehas (autor 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"Tsitaat id-ga {id} juba eksisteerib", 400
      quote = {
          "id": int(id),
          "author": params["author"],
          "quote": params["quote"]
      }
      ai_quotes.append(quote)
      return quote, 201

Ülaltoodud koodis vĂ”ttis POST-meetod tsitaadi ID. SeejĂ€rel kasutas ta reqparse'i, et saada autor ja tsitaat pĂ€ringust, salvestades need sĂ”nastikku params.

Kui tsitaat mÀÀratud ID-ga juba eksisteerib, siis kuvab meetod sobiva teadete ja koodi 400.

Kui tsitaat mÀÀratud ID-ga veel ei olnud loodud, loob meetod uue kirje mÀÀratud ID ja autoriga, samuti teiste parameetritega. SeejÀrel lisab see kirje ai_quotes loendisse ja tagastab uue tsitaadi kirje koos koodiga 201.

NĂŒĂŒd loome PUT-meetodi olemasoleva tsitaadi muutmiseks registris

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, sarnaselt eelnevale nÀitele, vÔtab ID ja sisendi ning parsetab tsiteeringu parameetrid, kasutades reqparse'i.

Kui tsiteering, mille ID on mÀÀratud, eksisteerib, uuendab meetod seda uute parameetritega ja kuvab seejÀrel uuendatud tsiteeringu koodiga 200. Kui tsiteeringut mÀÀratud ID-ga pole, luuakse uus kirje koodiga 201.

LÔpuks loome DELETE meetodi tsiteeringu kustutamiseks, mis enam ei inspireeri.

def delete(self, id):
      global ai_quotes
      ai_quotes = [quote for quote in ai_quotes if quote["id"] != id]
      return f"Quote with id {id} is deleted.", 200

See meetod saab tsiteeringu ID sisendi ja uuendab ai_quotes loendit, kasutades globaalset loendit.

NĂŒĂŒd, kui oleme kĂ”ik meetodid loonud, peame lihtsalt lisama ressursi API-le, mÀÀrama tee ja kĂ€ivitama Flaski.

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

Meie REST API teenus on valmis!

Edasi saame koodi salvestada faili app.py, kÀivitades selle terminalis kÀsuga:

python3 app.py

Kui kÔik on hÀsti, saame midagi sellist:

* Debug reĆŸiim: sisse lĂŒlitatud
* Jooksul 127.0.0.1:5000\/ (T9 CTRL+C, et lÔpetada)
* TaaskÀivitamine staatilise andmetega
* Siluri tööriist on aktiivne!
* Siluri PIN: XXXXXXX

Testime API-d

PĂ€rast API loomist tuleb see testida.

Seda saab teha kas kÀsurea tööriista curl vÔi Insomnia REST kliendiga, vÔi avaldades API Rapid API-s.

Kirjutame API Pythonis (Flaski ja RapidAPI-ga)

Avaldame meie API

RapidAPI on maailma suurim turuplats, kus on rohkem kui 10 000 API (ja umbes 1 miljon arendajat).

RapidAPI pakub mitte ainult ĂŒhte liidese töötamiseks kolmandate osapoolte API-dega, vaid ka vĂ”imalust kiiresti ja probleemideta avaldada oma API.

Selleks et selleks, peate esmalt avaldama selle mÔnes serveris vÔrgus. Me kasutame selles kontekstis Heroku. Töösel ei tohiks tekkida mingeid keerukusi, (seda saab rohkem teada siit).

Kuidas avaldada oma API Heroku-s

1. Paigaldame Heroku.

Esmalt tuleb registreeruda ja paigaldada Heroku kÀsurealiidese (CLI). See töötab Ubuntu 16+ peal.

sudo snap install heroku —classic

SeejÀrel logime sisse:

heroku login

2. Lisame vajalikud failid.

NĂŒĂŒd tuleb lisada failid avaldamiseks meie rakenduse kausta:

  • requirements.txt koos vajalike Python moodulite nimekirjaga;
  • Procfile, mis nĂ€itab, milliseid kĂ€ske tuleb rakenduse kĂ€ivitamiseks tĂ€ita;
  • .gitignore — faile, mida serveris pole vaja, ignoreerimiseks.

Fail requirements.txt sisaldab jÀrgmisi ridu:

  • flask
  • flask-restful
  • gunicorn

Palun pange tÀhele: oleme gunicorn'i (Python WSGI HTTP Server) nimekirja lisanud, kuna peame meie rakenduse serveris kÀivitama.

Procfile sisaldab:

web: gunicorn app:app

.gitignore sisu:

*.pyc
__pycache__/

NĂŒĂŒd, kui failid on loodud, algatame git-repo ja teeme commit'i:

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

3. Loome uue Heroku rakenduse.

heroku create

Saadame master haru kaugservisse Heroku:

git push heroku master

NĂŒĂŒd on vĂ”imalik alustada, avades API teenuse kĂ€sku:

heroku ps:scale web=1
heroku open
 

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

Kuidas lisada oma Python API RapidAPI turule

PĂ€rast seda, kui API teenus on Herokusse avaldatud, saab selle lisada Rapid API-sse. Siin on detailne dokumentatsioon selle teema kohta.

1. Loome RapidAPI konto.

Kirjutame API Pythonis (Flaski ja RapidAPI-ga)

Registreerige tasuta konto - seda saab teha Facebooki, Google'i vÔi GitHubi abil.

Kirjutame API Pythonis (Flaski ja RapidAPI-ga)

2. Lisame API juhtpaneelile.

Kirjutame API Pythonis (Flaski ja RapidAPI-ga)

3. Sisestame ĂŒldteabe oma API kohta.

Kirjutame API Pythonis (Flaski ja RapidAPI-ga)

4. PĂ€rast nuppu "Lisa API" avaneb uus leht, kus saab sisestada teavet meie API kohta.

Kirjutame API Pythonis (Flaski ja RapidAPI-ga)

5. NĂŒĂŒd saab kas kĂ€sitsi sisestada API lĂ”pp-punkte vĂ”i laadida swagger-faili OpenAPI abil.

Kirjutame API Pythonis (Flaski ja RapidAPI-ga)

NĂŒĂŒd tuleb mÀÀrata meie API lĂ”pp-punktid lehel LĂ”pp-punktid. Meie puhul vastavad lĂ”pp-punktid CRUD kontseptsioonile (get, post, put, delete).

Kirjutame API Pythonis (Flaski ja RapidAPI-ga)

JÀrgmiseks tuleb luua GET AI Quote lÔpp-punkt, mis vÀljendab juhuslikku tsitaati (kui ID on vaikimisi) vÔi tsitaati antud ID jaoks.

LÔpp-punkti loomiseks tuleb vajutada nuppu "Loo lÔpp-punkt".

Kirjutame API Pythonis (Flaski ja RapidAPI-ga)

Korrake seda protsessi kÔigi teiste API lÔpp-punktide jaoks. Sellega on kÔik! Palju Ônne, olete oma API avaldanud!

Kui kÔik on hÀsti, nÀeb API leht vÀlja umbes selline:

Kirjutame API Pythonis (Flaski ja RapidAPI-ga)

KokkuvÔte

Selles artiklis uurisime, kuidas luua oma RESTful API teenus Pythonis, koos API avaldamise protsessiga cloud Herokus ja selle lisamisega RapidAPI katalooge.

Kuid testimisversioonis nĂ€idati ainult API arendamise pĂ”hialuseid - sellised nĂŒansid nagu turvalisus, tĂ”rke taluvus ja skaleeritavus ei olnud kĂ€sitletud.

Reaalse API arendamisel tuleb kÔike seda arvesse vÔtta.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster