API rašymas Python (su Flask ir RapidAPI)

API rašymas Python (su Flask ir RapidAPI)

Jei skaitote šį straipsnį, tikriausiai jau esate susipažinę su galimybėmis, kurios atsiveria naudojant API (Application Programming Interface).

Prie programos pridėję vieną iš daugelio viešųjų API, galite išplėsti šios programos funkcionalumą arba papildyti ją reikalingais duomenimis. Bet ką daryti, jei sukūrėte unikalią funkciją, kuria norite pasidalinti su bendruomene?

Atsakymas paprastas: reikia sukurti savo API.

Nors iš pradžių tai gali atrodyti nelengva užduotis, iš tikrųjų ji gana paprasta. Parodysime, kaip tai padaryti naudojant Python.

Ko reikia norint pradėti

Norėdami sukurti API, jums reikia:

  • Python 3;
  • Kolba — paprasta ir paprasta naudoti žiniatinklio programų kūrimo sistema;
  • Kolba-PAilsėjęs yra Flask plėtinys, leidžiantis greitai ir su minimalia konfigūracija sukurti REST API.

Diegimas atliekamas pagal komandą:

pip install flask-restful

Pradedantiesiems rekomenduojame nemokamą intensyvų programavimą:
Telegram boto kūrimas C# — rugpjūčio 26–28 d. Nemokamas intensyvus kursas, leidžiantis suprasti kaip veikia asistentai botai, darbo su Telegram API specifika ir kitus niuansus. Trys geriausi dalyviai iš „Skillbox“ gaus 30 000 rublių.

Prieš tau pradedant

Mes ketiname sukurti RESTful API su baziniu CRUID funkcionalumas.

Norėdami visiškai suprasti užduotį, supraskime du aukščiau paminėtus terminus.

Kas yra REST?

REST API (representational State Transfer) yra API, kuri naudoja HTTP užklausas keistis duomenimis.

REST API turi atitikti tam tikrus kriterijus:

  • Kliento ir serverio architektūra: klientas sąveikauja su vartotojo sąsaja, o serveris sąveikauja su užpakaline sistema ir duomenų saugykla. Klientas ir serveris yra nepriklausomi, bet kurį iš jų galima pakeisti atskirai nuo kito.
  • Be pilietybės – serveryje nesaugomi jokie kliento duomenys. Seanso būsena saugoma kliento pusėje.
  • Saugojimas talpykloje – klientai gali talpykloje saugoti serverio atsakymus, kad pagerintų bendrą našumą.

Kas yra CRUD?

Neapdorotas yra programavimo koncepcija, apibūdinanti keturis pagrindinius veiksmus (kurti, skaityti, atnaujinti ir ištrinti).

REST API užklausų tipai ir užklausų metodai yra atsakingi už tokius veiksmus kaip paskelbti, gauti, įdėti, ištrinti.

Dabar, kai išnagrinėjome pagrindines sąlygas, galime pradėti kurti API.

Vystymasis

Sukurkime citatų apie dirbtinį intelektą saugyklą. AI yra viena iš sparčiausiai augančių technologijų šiandien, o Python yra populiarus darbo su AI įrankis.

Naudodamas šią API, Python kūrėjas gali greitai gauti informacijos apie AI ir įkvėpti naujų pasiekimų. Jei kūrėjas turi vertingų minčių šia tema, jis galės jas įtraukti į saugyklą.

Pradėkime importuodami reikalingus modulius ir nustatydami „Flask“:

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

Šiame fragmente mums reikalingos klasės yra „Flask“, „Api“ ir „Resource“.

Reqparse yra Flask-RESTful užklausų analizės sąsaja... Taip pat reikės atsitiktinio modulio, kad būtų rodoma atsitiktinė citata.

Dabar sukursime citatų apie AI saugyklą.

Kiekviename repo įraše bus:

  • skaitmeninis ID;
  • citatos autoriaus pavardė;
  • citata.

Kadangi tai tik mokymosi pavyzdys, visus įrašus saugosime Python sąraše. Tikroje programoje greičiausiai naudotume duomenų bazę.

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

Dabar turime sukurti „Quote“ išteklių klasę, kuri apibrėžs mūsų API galinių taškų operacijas. Klasėje turi būti deklaruoti keturi metodai: gauti, paskelbti, įdėti, ištrinti.

Pradėkime nuo GET metodo

Tai leidžia gauti konkrečią citatą, nurodant jos ID, arba atsitiktinę citatą, jei ID nenurodytas.

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 metodas grąžina atsitiktinę citatą, jei ID yra numatytoji reikšmė, t.y. skambinant metodo ID nebuvo nustatytas.

Jei jis nurodytas, metodas ieško citatų ir suranda tą, kurioje yra nurodytas ID. Jei nieko nerasta, rodomas pranešimas „Citata nerasta, 404“.

Atminkite, kad metodas grąžina HTTP būseną 200, jei užklausa buvo sėkminga, ir 404, jei įrašas nerastas.

Dabar sukurkime POST metodą, kad į saugyklą įtrauktume naują citatą

Kai įvesite, jis gaus kiekvienos naujos citatos ID. Be to, POST naudos reqparse, kad išanalizuoti parametrus, kurie bus įtraukti į užklausos turinį (autorius ir citatos tekstas).

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

Anksčiau pateiktame kode POST metodas priėmė citatos ID. Tada, naudodamas reqparse, jis iš užklausos nuskaito autorių ir citatą, išsaugodamas juos parametrų žodyne.

Jei citata su nurodytu ID jau yra, metodas rodo atitinkamą pranešimą ir kodą 400.

Jei citata su nurodytu ID dar nesukurta, metodas sukuria naują įrašą su nurodytu ID ir autoriumi bei kitais parametrais. Tada jis prideda įrašą prie ai_quotes sąrašo ir grąžina įrašą su nauja citata kartu su kodu 201.

Dabar sukuriame PUT metodą, kad pakeistume esamą citatą saugykloje

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 metodas, panašus į ankstesnį pavyzdį, paima ID ir įvestį bei analizuoja citatos parametrus naudojant reqparse.

Jei citata su nurodytu ID egzistuoja, metodas ją atnaujins naujais parametrais ir išves atnaujintą citatą su kodu 200. Jei dar nėra citatos su nurodytu ID, bus sukurtas naujas įrašas su kodu 201.

Galiausiai sukurkime DELETE metodą, kad pašalintume nebeįkvepiančią citatą.

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

Šis metodas naudoja citatos ID kaip įvestį ir atnaujina ai_quotes sąrašą naudodamas bendrinamą sąrašą.

Dabar, kai sukūrėme visus metodus, tereikia tiesiog pridėti išteklius prie API, nustatyti kelią ir paleisti Flask.

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

Mūsų REST API paslauga paruošta!

Tada galime įrašyti kodą į failą app.py, paleisdami jį konsolėje naudodami komandą:

python3 app.py

Jei viskas bus gerai, gausime kažką panašaus:

* Derinimo režimas: įjungtas
* Bėga toliau 127.0.0.1:5000/ (Norėdami išeiti, paspauskite CTRL+C)
* Paleidimas iš naujo su stat
* Debugger aktyvus!
* Derinimo priemonės PIN kodas: XXXXXXX

API testavimas

Sukūrus API, ją reikia išbandyti.

Tai galima padaryti naudojant curl konsolės įrankį arba Insomnia REST klientą arba paskelbus API Rapid API.

API rašymas Python (su Flask ir RapidAPI)

Skelbiame mūsų API

„RapidAPI“ yra didžiausia rinka pasaulyje, turinti daugiau nei 10 000 API (ir apie 1 mln. kūrėjų).

RapidAPI ne tik suteikia vieną sąsają darbui su trečiųjų šalių API, bet ir leidžia greitai ir lengvai paskelbti savo API.

Į daryk, pirmiausia turite jį paskelbti kokiame nors tinklo serveryje. Mūsų atveju mes naudosime Heroku. Darbas su juo neturėtų sukelti jokių sunkumų, (daugiau apie tai galite sužinoti čia).

Kaip paskelbti savo API Heroku

1. Įdiekite Heroku.

Pirmas žingsnis yra užregistruoti ir įdiegti „Heroku Command Line Interface“ (CLI). Tai veikia Ubuntu 16+.

sudo snap install heroku --classic

Tada prisijunkite:

heroku prisijungimas

2. Pridėkite reikiamus failus.

Dabar turime pridėti failus, kuriuos norite paskelbti, į mūsų programos aplanką:

  • követelmények.txt su reikalingų Python modulių sąrašu;
  • Profilis, nurodantis, kurios komandos turi būti vykdomos norint paleisti programą;
  • .gitignore – neįtraukti failų, kurių serveryje nereikia.

Reikalavimus.txt faile bus šios eilutės:

  • kolba
  • kolba-ramus
  • vienaragis

Atkreipkite dėmesį, kad į sąrašą įtraukėme gunicorn (Python WSGI HTTP Server), nes turime paleisti savo programą serveryje.

Profilyje bus:

žiniatinklis: gunicorn programa: programa

.gitignore turinys:

*.pyc
__pycache__/

Dabar, kai failai yra sukurti, inicijuokime git repo ir įsipareigokime:

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

3. Sukurkite naują Heroku programėlę.

heroku create

Pagrindinės šakos perkėlimas į nuotolinį „Heroku“ repo:

git push heroku master

Dabar galite pradėti atidarydami API paslaugą komandomis:

heroku ps:scale web=1
heroku open
 

API bus pasiekiama adresu your-random-heroku-name.herokuapp.com/ai-quotes.

Kaip pridėti savo Python API prie RapidAPI rinkos

Kai jūsų API paslauga bus paskelbta Heroku, galėsite pridėti ją prie Rapid API. Čia išsamią dokumentaciją šia tema.

1. Sukurkite RapidAPI paskyrą.

API rašymas Python (su Flask ir RapidAPI)

Užregistruokite nemokamą paskyrą – tai galima padaryti naudojant Facebook, Google, GitHub.

API rašymas Python (su Flask ir RapidAPI)

2. Pridėkite API prie valdymo skydelio.

API rašymas Python (su Flask ir RapidAPI)

3. Tada įveskite bendrą informaciją apie savo API.

API rašymas Python (su Flask ir RapidAPI)

4. Spustelėjus „Pridėti API“ pasirodys naujas puslapis, kuriame galėsite įvesti informaciją apie mūsų API.

API rašymas Python (su Flask ir RapidAPI)

5. Dabar galite rankiniu būdu įvesti API galinius taškus arba atsisiųsti swagger failas naudojant OpenAPI.

API rašymas Python (su Flask ir RapidAPI)

Na, dabar puslapyje „Galiniai taškai“ turite nustatyti mūsų API galinius taškus. Mūsų atveju galiniai taškai atitinka CRUD sąvoką (gauti, paskelbti, įdėti, ištrinti).

API rašymas Python (su Flask ir RapidAPI)

Tada turite sukurti GET AI Quote galutinį tašką, kuriame būtų rodoma atsitiktinė citata (jei ID yra numatytasis) arba nurodyto ID citata.

Norėdami sukurti galinį tašką, turite spustelėti mygtuką „Sukurti galinį tašką“.

API rašymas Python (su Flask ir RapidAPI)

Šį procesą kartojame su visais kitais API galutiniais taškais. Tai viskas! Sveikiname, paskelbėte savo API!

Jei viskas gerai, API puslapis atrodys maždaug taip:

API rašymas Python (su Flask ir RapidAPI)

išvada

Šiame straipsnyje apžvelgėme savo RESTful API paslaugos „Python“ kūrimo procesą, taip pat API paskelbimą „Heroku“ debesyje ir įtraukimą į „RapidAPI“ katalogą.

Tačiau bandomojoje versijoje buvo parodyti tik pagrindiniai API kūrimo principai – nebuvo atsižvelgta į tokius niuansus kaip saugumas, atsparumas gedimams ir mastelio keitimas.

Kuriant tikrą API, į visa tai reikia atsižvelgti.

Šaltinis: www.habr.com

Добавить комментарий