Izstrādājam API Python (ar Flask un RapidAPI)

Izstrādājam API Python (ar Flask un RapidAPI)

Ja jūs lasāt šo rakstu, visticamāk, jau esat pazīstams ar iespējām, kas paveras, izmantojot API (lietojumprogrammu programmēšanas saskarni).

Pievienojot savai lietotnei vienu no daudziem atklātajiem API, jūs varat paplašināt tās funkcionalitāti vai papildināt to ar nepieciešamajiem datiem. Bet ko darīt, ja jūs esat izstrādājis unikālu funkciju, ko vēlaties dalīt ar kopienu?

Atbilde ir vienkārša: jums jāizveido savs API..

Neskatoties uz to, ka tas sākumā šķiet sarežģīts uzdevums, patiesībā viss ir vienkārši. Mēs pastāstīsim, kā to izdarīt, izmantojot Python.

Kas nepieciešams, lai uzsāktu darbu

API izstrādei nepieciešams:

  • Python 3;
  • Flask — vienkārša un viegli lietojama ietvarstruktūra tīmekļa lietotņu izstrādei;
  • Flask-RESTful — paplašinājums Flask, kas ļauj ātri izstrādāt REST API ar minimālu konfigurāciju.

Uzstādīšanu veic ar komandu:

pip install flask-restful

Iesakām bezmaksas intensīvu programmēšanas kursu iesācējiem:
Telegram bot izstrāde C# — no 26. līdz 28. augustam. Bezmaksas intensīvs, kas ļauj saprast, kā darbojas palīgu bot, par API Telegram īpašībām un citiem niansēm. Trīs labākie dalībnieki saņems no Skillbox 30 000 rubļu..

Pirms sākat

mēs plānojam izstrādāt RESTful API ar pamata CRUD funkcionalitāti..

Lai pilnībā izprastu uzdevumu, aplūkosim divus iepriekš minētos terminus.

Kas ir REST?

REST API (Representational State Transfer) — tas ir API, kas izmanto HTTP pieprasījumus datu apmaiņai.

REST API ir jāatbilst noteiktiem kritērijiem:

  • Klienta-servera arhitektūra: klients mijiedarbojas ar lietotāja interfeisu, bet serveris — ar aizmuguri un datu glabātuvi. Klients un serveris ir neatkarīgi, jebkuru no tiem var aizstāt atsevišķi.
  • Bezstatiskums — nekādi klienta dati netiek saglabāti serverī. Sesijas stāvoklis tiek glabāts klienta pusē.
  • Kešojamība — klienti var kešot servera atbildes, lai uzlabotu vispārējo veiktspēju.

Kas ir CRUD?

CRUD — programmēšanas koncepcija, kas apraksta četrus pamata darbības (izveidošana, lasīšana, atjaunināšana un dzēšana).

REST API pieprasījumu tipi un pieprasījumu metodes atbild par tādām darbībām kā post, get, put, delete.

Tagad, kad mēs esam izpratuši pamata terminus, varam ķerties pie API izstrādes.

Izstrāde

Izveidosim mākslīgā intelekta citātu repozitoriju. MĀKSLĪGAIS INTELEKTS ir viena no visaktīvāk attīstītajām tehnoloģijām mūsdienās, un Python ir populārs rīks darbam ar MĀKSLĪGO INTELEKTU.

Ar šo API Python izstrādātājs varēs ātri iegūt informāciju par MĀKSLĪGO INTELEKTU un iedvesmoties no jauniem sasniegumiem. Ja izstrādātājam ir vērtīgas domas šajā tēmā, viņš varēs tās pievienot repozitorijam.

Sāksim ar nepieciešamo moduļu importēšanu un Flask iestatīšanu:

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

Šajā kodeksā Flask, Api un Resource ir klases, kas mums nepieciešamas.

Reqparse ir Flask-RESTful pieprasījumu parsēšanas saskarne... Tāpat nepieciešams random modulis, lai parādītu nejaušu citātu.

Tagad izveidosim MĀKSLĪGAJĀ INTELEKTĀ citātu repozitoriju.

Katram repozitorija ierakstam būs:

  • digitālais ID;
  • citāta autora vārds;
  • citāts.

Tā kā tas ir tikai piemērs mācībām, mēs saglabāsim visus ierakstus Python sarakstā. Reālā lietojumprogrammā mēs, visticamāk, izmantosim datubāzi.

ai_quotes = [
    {
        "id": 0,
        "author": "Kevins Kelli",
        "quote": "Nākamo 10,000 jaunuzņēmumu biznesa plāni būs viegli prognozējami: " +
                 "Paņem X un pievieno AI."
    },
    {
        "id": 1,
        "author": "Stīvens Hoking",
        "quote": "Pilnīgas mākslīgās inteliģences attīstība varētu " +
                 "norādīt uz cilvēces galu… " +
                 "Tā uzsāks attīstību patstāvīgi un pārveidos " +
                 "sevi ar arvien pieaugošu ātrumu. " +
                 "Cilvēki, kuri ir ierobežoti ar lēnu bioloģisko evolūciju, " +
                 "nebūtu spējīgi konkurēt, un tos aizvietos."
    },
    {
        "id": 2,
        "author": "Klods Šenons",
        "quote": "Es redzu laiku, kad mēs robotiem būsim tādi paši kā " +
                 "suņi cilvēkiem, " +
                 "un es atbalstu mašīnas."
    },
    {
        "id": 3,
        "author": "Ilons Masks",
        "quote": "Progresu mākslīgajā inteliģencē " +
                 "(es nerunāju par šauru AI) " +
                 "ir neticami ātrs. Ja vien jums nav tiešas " +
                 "saskares ar grupām kā Deepmind, " +
                 "jums nav ne jausmas, cik ātri – tas aug " +
                 "tuvu eksponenciālam. " +
                 "Riska līmenis, ka notiks kaut kas tiešām bīstams, " +
                 "ir piecu gadu laikā." +
                 "Desmit gadu maksimums."
    },
    {
        "id": 4,
        "author": "Džefrijs Hinton",
        "quote": "Es vienmēr esmu bijis pārliecināts, ka vienīgais veids, " +
                 "kā panākt, lai mākslīgā inteliģence darbotos, " +
                 "ir veikt aprēķinus līdzīgi kā cilvēka smadzenēm. " +
                 "Tas ir mērķis, ko esmu centies sasniegt. Mēs virzāmies uz priekšu, " +
                 "lai gan mums joprojām ir daudz jāiemācās par " +
                 "to, kā tieši strādā smadzenes."
    },
    {
        "id": 5,
        "author": "Pedro Domingos",
        "quote": "Cilvēki bažījas, ka datori kļūs " +
                 "pārāk gudri un pārņems pasauli, " +
                 "bet īstā problēma ir tā, ka viņi ir pārāk stulbi " +
                 "un jau ir pārņēmuši pasauli."
    },
    {
        "id": 6,
        "author": "Alans Tjūrings",
        "quote": "Izskatās, ka ir iespējams, ka, kad mašīnu domāšanas " +
                 "metode ir sākusies, tas neaizņems ilgu laiku, " +
                 "lai pārspētu mūsu vājās spējas… " +
                 "Viņi spēs sazināties " +
                 "savā starpā, lai uzlabotu savas prāta spējas. " +
                 "Tādējādi, kādā posmā mums, visticamāk, " +
                 "būs jāgaida, ka mašīnas pārņems kontroli."
    },
    {
        "id": 7,
        "author": "Rejs Kurcveils",
        "quote": "Mākslīgā inteliģence sasniegs " +
                 "cilvēku līmeni ap 2029. gadu. " +
                 "Ja skatāmies tālāk uz, teiksim, 2045. gadu, " +
                 "mēs būsim reizinājuši intelektu, " +
                 "cilvēku bioloģiskā mašīnu intelekta " +
                 "mūsu civilizācijā par miljardu."
    },
    {
        "id": 8,
        "author": "Sebastians Trūns",
        "quote": "Neviens to nepauž šādi, bet es domāju, " +
                 "ka mākslīgā inteliģence " +
                 "ir gandrīz humanitārā disciplīna. Tas patiesībā ir mēģinājums " +
                 "izprast cilvēku intelektu un cilvēku kognīciju."
    },
    {
        "id": 9,
        "author": "Endrjū Ng",
        "quote": "Mēs izsaka šo analoģiju, ka AI ir jaunā elektrība." +
                 "Elektrība pārveidoja nozares: lauksaimniecību, " +
                 "transportu, komunikāciju, ražošanu."
    }
]

Tagad jāizveido resursu klase Quote, kas definēs mūsu API galapunktu operācijas. Klasē jādeklarē četri metodes: get, post, put, delete.

Sāksim ar metodi GET

Tā ļauj iegūt noteiktu citātu, norādot tās ID, vai arī nejaušu citātu, ja ID nav norādīts.

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

GET metode atgriež nejaušu citātu, ja ID satur noklusējuma vērtību, t.i., izsaucot metodi, ID nav norādīts.

Ja tas ir norādīts, tad metode meklē citātu un atrod to, kurai ir norādītais ID. Ja nekas netiek atrasts, tiek izvadīts ziņojums “Quote not found, 404”.

Atcerieties: metode atgriež HTTP statusu 200 gadījumā, ja pieprasījums ir veiksmīgs, un 404, ja ieraksts netiek atrasts.

Tagad izveidosim POST metodi, lai pievienotu jaunu citātu repozitorijam

Tā saņems katras jaunas citāta identifikatoru, kad tas tiks ievadīts. Turklāt POST izmanto reqparse, lai analizētu parametrus, kas tiks nosūtīti pieprasījuma ķermenī (autors un citāta teksts).

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

Iepriekš minētajā kodā POST metode pieņēmusi citāta ID. Tad, izmantojot reqparse, tā ieguva autoru un citātu no pieprasījuma, saglabājot tos vārdnīcā params.

Ja citāts ar norādīto ID jau eksistē, metode izvada atbilstošu ziņojumu un kodu 400.

Ja citāts ar norādīto ID vēl nav izveidots, metode izveido jaunu ierakstu ar norādīto ID un autoru, kā arī citiem parametriem. Pēc tam tā pievieno ierakstu sarakstam ai_quotes un atgriež ierakstu ar jauno citātu kopā ar kodu 201.

Tagad izveidosim PUT metodi, lai mainītu esošu citātu repozitorijā

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 metode, līdzīgi kā iepriekšējā piemērā, ņem ID un input un analizē citāta parametrus, izmantojot reqparse.

Ja citāts ar norādīto ID pastāv, metode to atjauninās ar jaunajiem parametriem un pēc tam izvadīs atjaunināto citātu ar 200 kodu. Ja citāta ar norādīto ID vēl nav, tiks izveidota jauna ieraksts ar 201 kodu.

Visbeidzot, izveidosim DELETE metodi, lai dzēstu citātu, kas vairs neiedvesmo.

def delete(self, id):
      global ai_quotes
      ai_quotes = [quote for quote in ai_quotes if quote["id"] != id]
      return f"Citāts ar id {id} ir dzēsts.", 200

Šī metode saņem citāta ID ievadīšanas laikā un atjaunina ai_quotes sarakstu, izmantojot globālo sarakstu.

Tagad, kad esam izveidojuši visus metodus, viss, kas mums jāizdara, ir vienkārši pievienot resursu API, noteikt ceļu un palaist Flask.

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

Mūsu REST API pakalpojums ir gatavs!

Nākamais solis ir saglabāt kodu failā app.py, palaižot to konsolē ar komandu:

python3 app.py

Ja viss ir kārtībā, tad mēs saņemsim kaut ko līdzīgu šim:

* Debug režīms: ieslēgts
* Darbojas uz 127.0.0.1:5000\/ (Nospiediet CTRL+C, lai izietu)
* Pārstartēšana ar stat
* Debuggers ir aktīvs!
* Debuggera PIN: XXXXXXX

Testējam API

Pēc tam, kad API ir izveidots, to jātestē.

To var izdarīt, izmantojot komandrindas rīku curl vai Insomnia REST klientu, vai arī publicējot API Rapid API.

Izstrādājam API Python (ar Flask un RapidAPI)

Publicējam mūsu API

RapidAPI ir lielākais pasaules tirgus ar vairāk nekā 10 000 API (un apmēram 1 miljons izstrādātāju).

RapidAPI ne tikai nodrošina vienotu saskarni darbam ar trešo pušu API, bet arī piedāvā ātri un bez problēmām publicēt savu API.

Lai To izdarīt, vispirms jāpublicē to kādā serverī tīklā. Mūsu gadījumā izmantosim Heroku. Darbība ar to nevajadzētu izraisīt nekādas grūtības, (uzzināt par to vairāk var šeit).

Kā publicēt savu API uz Heroku

1. Instalējam Heroku.

Pirmais solis ir reģistrēties un instalēt Heroku Command Line Interface (CLI). Tas darbojas uz Ubuntu 16+.

sudo snap install heroku —classic

Tad piesakāmies:

heroku login

2. Pievienojam nepieciešamos failus.

Tagad jāpieņem faili publikācijai mūsu lietojumā:

  • requirements.txt ar nepieciešamo Python moduļu sarakstu;
  • Procfile, kurā norādīts, kuras komandas jāizpilda, lai palaistu lietojumprogrammu;
  • .gitignore — lai izslēgtu failus, kas nav nepieciešami serverī.

Fajls requirements.txt saturēs šādas rindas:

  • flask
  • flask-restful
  • gunicorn

Lūdzu, ņemiet vērā: mēs esam pievienojuši gunicorn (Python WSGI HTTP Server) sarakstam, jo ir nepieciešams palaist mūsu lietotni serverī.

Procfile saturēs:

web: gunicorn app:app

Satur .gitignore:

*.pyc
__pycache__/

Tagad, kad faili ir izveidoti, sāksim git-repozitoriju un veiksim apstiprinājumu:

git init
git add
git commit -m "Pirmais API apstiprinājums"

3. Izveidojam jaunu Heroku lietotni.

heroku create

Nosūtām master branch uz Heroku attālo repozitoriju:

git push heroku master

Tagad varam sākt, atverot API pakalpojumu ar komandām:

heroku ps:scale web=1
heroku open
 

API būs pieejams adresē your-random-heroku-name.herokuapp.com/ai-quotes.

Kā pievienot savu Python API RapidAPI tirgum

Pēc tam, kad API pakalpojums ir publicēts Heroku, to var pievienot Rapid API. Šeit ir detalizēta dokumentācija par šo tēmu.

1. Izveidojiet RapidAPI kontu.

Izstrādājam API Python (ar Flask un RapidAPI)

Reģistrējieties bezmaksas kontam — to var izdarīt, izmantojot Facebook, Google, GitHub.

Izstrādājam API Python (ar Flask un RapidAPI)

2. Pievienojiet API vadības panelī.

Izstrādājam API Python (ar Flask un RapidAPI)

3. Tālāk ievadiet vispārējo informāciju par savu API.

Izstrādājam API Python (ar Flask un RapidAPI)

4. Pēc pogas “Add API” nospiešanas parādās jauna lapa, kurā varat ievadīt informāciju par mūsu API.

Izstrādājam API Python (ar Flask un RapidAPI)

5. Tagad varat vai nu manuāli ievadīt API beigu punktus, vai augšupielādēt swagger-failu izmantojot OpenAPI.

Izstrādājam API Python (ar Flask un RapidAPI)

Tagad ir jānosaka mūsu API beigu punkti lapā Endpoints. Mūsu gadījumā beigu punkti atbilst CRUD koncepcijai (get, post, put, delete).

Izstrādājam API Python (ar Flask un RapidAPI)

Pēc tam jāizveido GET AI Quote beigu punkts, kas izvada nejaušu citātu (ja ID ir noklusēts) vai citātu norādītajam ID.

Lai izveidotu beigu punktu, nospiediet pogu “Create Endpoint”.

Izstrādājam API Python (ar Flask un RapidAPI)

Atkārtojiet šo procesu visiem citiem API beigu punktiem. Tas viss! Apsveicu, jūs esat publicējuši savu API!

Ja viss ir labi, API lapa izskatīsies apmēram šādi:

Izstrādājam API Python (ar Flask un RapidAPI)

Secinājums

Šajā rakstā mēs aplūkojām procesu, kā izveidot savu RESTful API pakalpojumu Python, kopā ar API publicēšanas procesu mākonī Heroku un tā pievienošanu RapidAPI katalogam.

Tomēr testēšanas variantā tika parādīti tikai pamata principi API izstrādē — tādi nianses kā drošība, noturība pret darbības traucējumiem un mērogojamība netika apskatīti.

Izstrādājot reālu API, tas viss ir jāņem vērā.

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster