Skrive en API i Python (med Flask og RapidAPI)

Skrive en API i Python (med Flask og RapidAPI)

Hvis du leser denne artikkelen, er du sannsynligvis allerede kjent med mulighetene som åpner seg ved bruk av API (Application Programming Interface).

Ved å legge til en av de mange offentlige API-ene til applikasjonen din, kan du utvide funksjonaliteten til denne applikasjonen eller supplere den med nødvendige data. Men hva om du har utviklet en unik funksjon som du vil dele med fellesskapet?

Svaret er enkelt: du trenger lag ditt eget API.

Selv om dette kan virke som en skremmende oppgave i begynnelsen, er det faktisk ganske enkelt. Vi viser deg hvordan du gjør dette med Python.

Hva du trenger for å komme i gang

API-utvikling krever:

  • Python3;
  • Kolbe — et enkelt og brukervennlig rammeverk for å lage nettapplikasjoner;
  • Flaske-HVILEfull er en utvidelse for Flask som lar deg utvikle en REST API raskt og med minimal konfigurasjon.

Installasjonen utføres av kommandoen:

pip install flask-restful

Vi anbefaler en gratis intensiv programmering for nybegynnere:
Telegram-botutvikling i C# — 26.–28. august. En gratis intensiv som lar deg forstå hvordan hjelperoboter fungerer, funksjonene ved å jobbe med Telegram API og andre nyanser. De tre beste deltakerne vil motta 30 000 rubler fra Skillbox.

Før du begynner

Vi skal utvikle en RESTful API med en grunnleggende CRUID-funksjonalitet.

For å forstå oppgaven fullt ut, la oss forstå de to begrepene nevnt ovenfor.

Hva er REST?

REST API (Representational State Transfer) er et API som bruker HTTP-forespørsler til å utveksle data.

REST APIer må oppfylle visse kriterier:

  • Klient-server-arkitektur: klienten samhandler med brukergrensesnittet, og serveren samhandler med backend og datalager. Klienten og serveren er uavhengige, hvilken som helst av dem kan erstattes separat fra den andre.
  • Stateless - Ingen klientdata er lagret på serveren. Sesjonstilstanden lagres på klientsiden.
  • Bufferbarhet – Klienter kan hurtigbufre serversvar for å forbedre den generelle ytelsen.

Hva er CRUD?

ULIK er et programmeringskonsept som beskriver fire grunnleggende handlinger (opprett, les, oppdater og slett).

I REST API er forespørselstyper og forespørselsmetoder ansvarlige for handlinger som post, get, put, delete.

Nå som vi har fått det grunnleggende ut av veien, er vi klare til å begynne å bygge API.

utforming

La oss lage et arkiv med sitater om kunstig intelligens. AI er en av de raskest voksende teknologiene i dag, og Python er et populært verktøy for å jobbe med AI.

Med denne API-en kan en Python-utvikler raskt lære om AI og bli inspirert av nye prestasjoner. Hvis utvikleren har verdifulle tanker om dette emnet, vil han kunne legge dem til depotet.

La oss starte med å importere de nødvendige modulene og sette opp Flask:

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

I denne kodebiten er Flask, Api og Resource klassene vi trenger.

Reqparse er et Flask-RESTful forespørsel-parsing-grensesnitt... Du vil også trenge den tilfeldige modulen for å vise et tilfeldig sitat.

Nå skal vi lage et depot med sitater om AI.

Hver repopost vil inneholde:

  • digital ID;
  • navnet på forfatteren av sitatet;
  • sitat.

Siden dette bare er et læringseksempel, vil vi lagre alle oppføringer i en Python-liste. I en ekte applikasjon ville vi mest sannsynlig brukt en database i stedet.

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å må vi lage en Quote-ressursklasse som vil definere operasjonene til API-endepunktene våre. Fire metoder må deklareres inne i klassen: get, post, put, delete.

La oss starte med GET-metoden

Den lar deg få et spesifikt tilbud ved å spesifisere ID, eller et tilfeldig tilbud hvis ingen ID er spesifisert.

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-metoden returnerer et tilfeldig anførselstegn hvis ID-en inneholder standardverdien, dvs. ID ble ikke angitt da metoden ble kalt.

Hvis den er satt, søker metoden blant anførselstegn og finner den som inneholder den gitte IDen. Hvis ingenting blir funnet, vises meldingen "Tilbud ikke funnet, 404".

Husk at metoden returnerer en HTTP-status på 200 hvis forespørselen var vellykket og 404 hvis oppføringen ikke ble funnet.

La oss nå lage en POST-metode for å legge til et nytt sitat til depotet

Den vil få ID-en til hvert nytt sitat mens du skriver. I tillegg vil POST bruke reqparse for å analysere parameterne som vil gå i forespørselsteksten (forfatter og sitattekst).

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

I koden ovenfor godtok POST-metoden en tilbuds-ID. Deretter, ved å bruke reqparse, hentet den forfatteren og sitatet fra forespørselen, og lagret dem i params-ordboken.

Hvis et tilbud med den angitte ID-en allerede eksisterer, viser metoden den aktuelle meldingen og koden 400.

Hvis et tilbud med den angitte IDen ennå ikke er opprettet, oppretter metoden en ny oppføring med den angitte IDen og forfatteren, samt andre parametere. Den legger deretter til en oppføring i ai_quotes-listen og returnerer en oppføring med et nytt sitat sammen med en 201-kode.

Nå lager vi en PUT-metode for å endre et eksisterende tilbud i depotet

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-metoden, lik det forrige eksempelet, tar en ID og en inngang og analyserer sitatparameterne ved å bruke reqparse.

Hvis et tilbud med spesifisert ID eksisterer, vil metoden oppdatere det med de nye parameterne og deretter sende ut det oppdaterte tilbudet med kode 200. Hvis det ikke finnes noe tilbud med spesifisert ID ennå, vil en ny post med kode 201 bli opprettet.

Til slutt, la oss lage en SLETT-metode for å fjerne et sitat som ikke lenger er inspirerende.

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

Denne metoden tar sitat-ID-en som input og oppdaterer listen over ai_quotes ved å bruke den delte listen.

Nå som vi har laget alle metodene, er alt vi trenger å gjøre ganske enkelt å legge til ressursen til API-en, angi banen og kjøre Flask.

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

Vår REST API-tjeneste er klar!

Deretter kan vi lagre koden i app.py-filen ved å kjøre den i konsollen med kommandoen:

python3 app.py

Hvis alt er bra, får vi noe slikt:

* Feilsøkingsmodus: på
* Kjører på 127.0.0.1:5000/ (Trykk CTRL+C for å avslutte)
* Starter på nytt med stat
* Debugger er aktiv!
* Feilsøkings-PIN: XXXXXXX

Tester API

Etter at API-en er opprettet, må den testes.

Dette kan gjøres ved å bruke curl-konsollverktøyet eller Insomnia REST-klienten, eller ved å publisere APIen på Rapid API.

Skrive en API i Python (med Flask og RapidAPI)

Publiserer vår API

RapidAPI er den største markedsplassen i verden med over 10 000 APIer (og rundt 1 million utviklere).

RapidAPI gir ikke bare ett enkelt grensesnitt for å jobbe med tredjeparts APIer, men lar deg også raskt og enkelt publisere din egen API.

Til å gjøre dette, må du først publisere den til en server på nettverket. I vårt tilfelle vil vi bruke Heroku. Å jobbe med ham skal ikke forårsake noen vanskeligheter, (du kan finne ut mer om det her).

Slik publiserer du API-en din på Heroku

1. Installer Heroku.

Det første trinnet er å registrere og installere Heroku Command Line Interface (CLI). Dette fungerer på Ubuntu 16+.

sudo snap install heroku --classic

Da logger vi inn:

heroku-pålogging

2. Legg til de nødvendige filene.

Nå må vi legge til filene som skal publiseres til en mappe i applikasjonen vår:

  • requirements.txt med en liste over nødvendige Python-moduler;
  • Procfile, som spesifiserer hvilke kommandoer som må utføres for å kjøre applikasjonen;
  • .gitignore - for å ekskludere filer som ikke er nødvendig på serveren.

requirements.txt-filen vil inneholde følgende linjer:

  • kolbe
  • kolbe-avslappende
  • pistolhorn

Vær oppmerksom på at vi har lagt til gunicorn (Python WSGI HTTP Server) til listen fordi vi trenger å kjøre applikasjonen vår på serveren.

Profilen vil inneholde:

web: gunicorn app: app

Innhold i .gitignore:

*.pyc
__pycache__/

Nå som filene er opprettet, la oss initialisere git-repoen og forplikte:

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

3. Opprett en ny Heroku-app.

heroku create

Skyver mastergrenen til den eksterne Heroku-repoen:

git push heroku master

Nå kan du starte med å åpne API-tjenesten med kommandoene:

heroku ps:scale web=1
heroku open
 

API-en vil være tilgjengelig kl your-random-heroku-name.herokuapp.com/ai-quotes.

Slik legger du til Python API til RapidAPI-markedsplassen

Når API-tjenesten er publisert på Heroku, kan du legge den til Rapid API. Her detaljert dokumentasjon om dette emnet.

1. Opprett en RapidAPI-konto.

Skrive en API i Python (med Flask og RapidAPI)

Vi registrerer en gratis konto - dette kan gjøres ved hjelp av Facebook, Google, GitHub.

Skrive en API i Python (med Flask og RapidAPI)

2. Legg til API til kontrollpanelet.

Skrive en API i Python (med Flask og RapidAPI)

3. Deretter skriver du inn generell informasjon om API-en din.

Skrive en API i Python (med Flask og RapidAPI)

4. Etter å ha klikket på "Legg til API" vises en ny side hvor du kan legge inn informasjon om vår API.

Skrive en API i Python (med Flask og RapidAPI)

5. Nå kan du enten angi API-endepunktene manuelt, eller laste ned swagger-fil ved hjelp av OpenAPI.

Skrive en API i Python (med Flask og RapidAPI)

Vel, nå må du angi endepunktene til API-en vår på Endpoints-siden. I vårt tilfelle tilsvarer endepunktene konseptet CRUD (hent, post, put, delete).

Skrive en API i Python (med Flask og RapidAPI)

Deretter må du opprette et GET AI Quote-endepunkt som viser et tilfeldig sitat (hvis IDen er standard) eller et sitat for den angitte IDen.

For å opprette et endepunkt, må du klikke på "Opprett endepunkt"-knappen.

Skrive en API i Python (med Flask og RapidAPI)

Vi gjentar denne prosessen for alle andre API-endepunkter. Det er alt! Gratulerer, du har publisert ditt API!

Hvis alt går bra, vil API-siden se omtrent slik ut:

Skrive en API i Python (med Flask og RapidAPI)

Konklusjon

I denne artikkelen gikk vi gjennom prosessen med å lage vår egen RESTful API-tjeneste i Python, sammen med prosessen med å publisere APIen til Heroku-skyen og legge den til RapidAPI-katalogen.

Men i testversjonen ble bare de grunnleggende prinsippene for API-utvikling vist - slike nyanser som sikkerhet, feiltoleranse og skalerbarhet ble ikke vurdert.

Når du utvikler et ekte API, må alt dette tas i betraktning.

Kilde: www.habr.com

Legg til en kommentar