API rakstīŔana programmā Python (ar Flask un RapidAPI)

API rakstīŔana programmā Python (ar Flask un RapidAPI)

Ja lasāt Å”o rakstu, iespējams, jau esat iepazinies ar iespējām, ko sniedz API (lietojumprogrammu saskarnes) izmantoÅ”ana.

Pievienojot savai lietojumprogrammai vienu no daudzajām atvērtajām API, varat paplaÅ”ināt lietojumprogrammas funkcionalitāti vai bagātināt to ar nepiecieÅ”amajiem datiem. Bet ko darÄ«t, ja esat izstrādājis unikālu funkciju, ko vēlaties kopÄ«got ar kopienu?

Atbilde ir vienkārŔa: jums ir nepiecieŔams izveidot savu API.

Lai gan sākumā tas var Ŕķist grÅ«ts uzdevums, patiesÄ«bā tas ir vienkārÅ”s. Mēs parādÄ«sim, kā to izdarÄ«t, izmantojot Python.

Kas jums ir nepiecieŔams, lai sāktu

Lai izstrādātu API, jums ir nepiecieŔams:

  • Python 3;
  • Kolba ā€” vienkārÅ”s un ērti lietojams ietvars tÄ«mekļa lietojumprogrammu izveidei;
  • Kolba-RESTful ir Flask paplaÅ”inājums, kas ļauj ātri un ar minimālu konfigurāciju izstrādāt REST API.

InstalēŔana tiek veikta ar komandu:

pip install flask-restful

Mēs iesakām bezmaksas intensÄ«vo programmÄ“Å”anas kursu iesācējiem:
Telegram botu izstrāde C# ā€” 26.ā€“28. augusts. Bezmaksas intensÄ«vais kurss, kas ļauj saprast, kā darbojas palÄ«gboti, darba specifika ar Telegram API un citas nianses. TrÄ«s labākie dalÄ«bnieki saņems 30 000 rubļu no Skillbox.

Pirms sākat

Mēs izstrādāsim RESTful API ar pamata CRUID funkcionalitāte.

Lai pilnÄ«bā izprastu uzdevumu, sapratÄ«sim divus iepriekÅ” minētos terminus.

Kas ir ATPÅŖTA?

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

REST API ir jāatbilst noteiktiem kritērijiem:

  • Klienta-servera arhitektÅ«ra: klients mijiedarbojas ar lietotāja interfeisu, un serveris mijiedarbojas ar aizmugursistēmu un datu krātuvi. Klients un serveris ir neatkarÄ«gi, jebkuru no tiem var nomainÄ«t atseviŔķi no otra.
  • Bezvalstnieks ā€“ serverÄ« netiek glabāti klienta dati. Sesijas stāvoklis tiek saglabāts klienta pusē.
  • KeÅ”atmiņa ā€” klienti var keÅ”atmiņā saglabāt servera atbildes, lai uzlabotu vispārējo veiktspēju.

Kas ir CRUD?

Neapstrādāts ir programmÄ“Å”anas koncepcija, kas apraksta četras pamata darbÄ«bas (izveidot, lasÄ«t, atjaunināt un dzēst).

Programmā REST API pieprasÄ«jumu veidi un pieprasÄ«jumu metodes ir atbildÄ«gi par tādām darbÄ«bām kā izlikÅ”ana, iegÅ«Å”ana, ievietoÅ”ana, dzÄ“Å”ana.

Tagad, kad esam sapratuŔi pamatnosacījumus, varam sākt API izveidi.

Attīstība

Izveidosim citātu krātuvi par mākslīgo intelektu. AI mūsdienās ir viena no visstraujāk augoŔajām tehnoloģijām, un Python ir populārs rīks darbam ar AI.

Izmantojot Å”o API, Python izstrādātājs var ātri iegÅ«t informāciju par AI un iedvesmoties no jauniem sasniegumiem. Ja izstrādātājam ir vērtÄ«gas domas par Å”o tēmu, viņŔ varēs tās pievienot krātuvei.

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ā fragmentā mums vajadzīgās klases ir Flask, Api un Resource.

Reqparse ir Flask-RESTful vaicājumu parsÄ“Å”anas interfeiss... Jums bÅ«s nepiecieÅ”ams arÄ« izlases modulis, lai parādÄ«tu nejauÅ”u citātu.

Tagad mēs izveidosim citātu krātuvi par AI.

Katrs repo ieraksts satur:

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

Tā kā Å”is ir tikai apmācÄ«bas piemērs, mēs visus ierakstus saglabāsim Python sarakstā. Reālā lietojumprogrammā mēs, iespējams, tā vietā izmantotu datu bāzi.

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

Tagad mums ir jāizveido Quote resursu klase, kas definēs mūsu API galapunktu darbības. Klasē jums ir jādeklarē četras metodes: iegūt, izlikt, ievietot, dzēst.

Sāksim ar GET metodi

Tas dod iespēju iegÅ«t konkrētu citātu, norādot tā ID, vai 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, netika norādÄ«ts ID.

Ja tas ir norādÄ«ts, metode meklē citātus un atrod to, kas satur norādÄ«to ID. Ja nekas netiek atrasts, tiek parādÄ«ts ziņojums ā€œCitāts nav atrasts, 404ā€.

Atcerieties: metode atgriež HTTP statusu 200, ja pieprasījums bija veiksmīgs, un 404, ja ieraksts netika atrasts.

Tagad izveidosim POST metodi, lai krātuvei pievienotu jaunu citātu

RakstÄ«Å”anas laikā tas saņems katra jaunā citāta ID. Turklāt POST izmantos reqparse, lai parsētu parametrus, kas tiks iekļauti pieprasÄ«juma pamattekstā (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ņēma piedāvājuma ID. Pēc tam, izmantojot reqparse, tā izguva autoru un citātu no vaicājuma, saglabājot tos parametru vārdnÄ«cā.

Ja citāts ar norādÄ«to ID jau pastāv, metode parāda 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 tas pievieno ierakstu ai_quotes sarakstam un atgriež ierakstu ar jauno citātu kopā ar kodu 201.

Tagad mēs izveidojam 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 ievadi un parsē citātu 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 kodu 200. Ja vēl nav citāta ar norādīto ID, tiks izveidots jauns ieraksts ar kodu 201.

Visbeidzot, izveidosim DELETE metodi, lai noņemtu citātu, kas vairs nav iedvesmojoÅ”s

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

Å Ä« metode kā ievadi iegÅ«st citāta ID un atjaunina ai_quotes sarakstu, izmantojot koplietoto sarakstu.

Tagad, kad esam izveidojuŔi visas metodes, viss, kas mums jādara, ir vienkārŔi jāpievieno resurss API, jāiestata ceļŔ un jāpalaiž Flask.

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

MÅ«su REST API pakalpojums ir gatavs!

Tālāk mēs varam saglabāt kodu failā app.py, palaižot to konsolē, izmantojot komandu:

python3 app.py

Ja viss ir labi, mēs iegūsim kaut ko līdzīgu:

* AtkļūdoÅ”anas režīms: ieslēgts
*Skrien tālāk 127.0.0.1:5000/ (Lai izietu, nospiediet taustiņu kombināciju CTRL+C)
* RestartēŔana ar stat
* Atkļūdotājs ir aktīvs!
* Atkļūdotāja PIN: XXXXXXX

API testēŔana

Kad API ir izveidota, tā ir jāpārbauda.

To var izdarīt, izmantojot curl konsoles utilītu vai Insomnia REST klientu, vai publicējot API Rapid API.

API rakstīŔana programmā Python (ar Flask un RapidAPI)

Notiek mūsu API publicēŔana

RapidAPI ir pasaulē lielākais tirgus ar vairāk nekā 10 000 API (un aptuveni 1 miljonu izstrādātāju).

RapidAPI ne tikai nodroÅ”ina vienotu saskarni darbam ar treÅ”o puÅ”u API, bet arÄ« sniedz iespēju ātri un vienkārÅ”i publicēt savu API.

LÄ«dz lai to izdarÄ«tu, vispirms tas jāpublicē kādā tÄ«kla serverÄ«. MÅ«su gadÄ«jumā mēs izmantosim Heroku. Darbs ar to nedrÄ«kst radÄ«t grÅ«tÄ«bas, (jÅ«s varat uzzināt vairāk par viņu Å”eit).

Kā publicēt savu API vietnē Heroku

1. Instalējiet Heroku.

Pirmais solis ir reģistrēt un instalēt Heroku komandrindas interfeisu (CLI). Tas darbojas uz Ubuntu 16+.

sudo snap install heroku ā€” klasika

Pēc tam piesakieties:

heroku pieteikŔanās

2. Pievienojiet nepiecieŔamos failus.

Tagad mums ir jāpievieno publicējamie faili mūsu lietojumprogrammas mapei:

  • prasÄ«bas.txt ar nepiecieÅ”amo Python moduļu sarakstu;
  • Profils, kas norāda, kādas komandas jāizpilda, lai palaistu programmu;
  • .gitignore ā€” lai izslēgtu failus, kas serverÄ« nav nepiecieÅ”ami.

Failā prasības.txt būs Ŕādas rindas:

  • kolbu
  • kolba-mierÄ«gs
  • lielradzis

LÅ«dzu, ņemiet vērā, ka sarakstam esam pievienojuÅ”i gunicorn (Python WSGI HTTP Server), jo mums ir jāpalaiž mÅ«su lietojumprogramma serverÄ«.

Profilā būs:

Web: Gunicorn app:app

Faila .gitignore saturs:

*.pyc
__pycache__/

Tagad, kad faili ir izveidoti, inicializēsim git repo un veiksim:

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

3. Izveidojiet jaunu Heroku lietojumprogrammu.

heroku create

Mēs virzām galveno filiāli uz attālo Heroku repo:

git push heroku master

Tagad varat sākt, atverot API pakalpojumu, izmantojot komandas:

heroku ps:scale web=1
heroku open
 

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

Kā pievienot savu Python API RapidAPI tirgum

Kad jÅ«su API pakalpojums ir publicēts Heroku, varat to pievienot Rapid API. Å eit detalizēta dokumentācija par Å”o tēmu.

1. Izveidojiet RapidAPI kontu.

API rakstīŔana programmā Python (ar Flask un RapidAPI)

ReÄ£istrējiet bezmaksas kontu ā€“ to var izdarÄ«t, izmantojot Facebook, Google, GitHub.

API rakstīŔana programmā Python (ar Flask un RapidAPI)

2. Pievienojiet API vadības panelim.

API rakstīŔana programmā Python (ar Flask un RapidAPI)

3. Pēc tam ievadiet vispārÄ«gu informāciju par savu API.

API rakstīŔana programmā Python (ar Flask un RapidAPI)

4. Pēc noklikŔķināŔanas uz ā€œPievienot APIā€ tiek parādÄ«ta jauna lapa, kurā varat ievadÄ«t informāciju par mÅ«su API.

API rakstīŔana programmā Python (ar Flask un RapidAPI)

5. Tagad varat manuāli ievadīt API galapunktus vai lejupielādēt swagger-fails izmantojot OpenAPI.

API rakstīŔana programmā Python (ar Flask un RapidAPI)

Tagad mums ir jāiestata mūsu API galapunkti lapā Endpoints. Mūsu gadījumā galapunkti atbilst CRUD jēdzienam (get, post, put, delete).

API rakstīŔana programmā Python (ar Flask un RapidAPI)

Pēc tam jums ir jāizveido GET AI Quote galapunkts, kas parāda nejauÅ”u citātu (ja ID ir noklusējuma) vai citātu norādÄ«tajam ID.

Lai izveidotu galapunktu, noklikŔķiniet uz pogas "Izveidot galapunktu".

API rakstīŔana programmā Python (ar Flask un RapidAPI)

Mēs atkārtojam Å”o procesu visiem citiem API galapunktiem. Tas ir viss! Apsveicam! JÅ«s esat publicējis savu API!

Ja viss ir kārtÄ«bā, API lapa izskatÄ«sies apmēram Ŕādi:

API rakstīŔana programmā Python (ar Flask un RapidAPI)

Secinājums

Å ajā rakstā mēs uzzinājām, kā Python izveidot savu RESTful API pakalpojumu, kā arÄ« API publicÄ“Å”anu Heroku mākonÄ« un pievienoÅ”anu RapidAPI direktorijam.

Bet testa versija parādÄ«ja tikai API izstrādes pamatprincipus ā€“ netika ņemtas vērā tādas nianses kā droŔība, kļūdu tolerance un mērogojamÄ«ba.

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

Avots: www.habr.com

Pievieno komentāru