At skrive en API i Python (med Flask og RapidAPI)

At skrive en API i Python (med Flask og RapidAPI)

Hvis du læser denne artikel, er du sikkert allerede bekendt med de muligheder, der åbner sig, når du bruger API'en (Application Programming Interface).

Ved at tilføje en af ​​de mange offentlige API'er til din applikation, kan du udvide funktionaliteten af ​​denne applikation eller supplere den med de nødvendige data. Men hvad nu hvis du har udviklet en unik funktion, som du vil dele med fællesskabet?

Svaret er enkelt: du har brug for lav din egen API.

Selvom dette kan virke som en skræmmende opgave i starten, er det faktisk ret simpelt. Vi viser dig, hvordan du gør det med Python.

Hvad du skal bruge for at komme i gang

API-udvikling kræver:

  • Python3;
  • Flask — en enkel og letanvendelig ramme til oprettelse af webapplikationer;
  • Kolbe-HVILEfuld er en udvidelse til Flask, der giver dig mulighed for at udvikle en REST API hurtigt og med minimal konfiguration.

Installationen udføres af kommandoen:

pip install flask-restful

Vi anbefaler en gratis intensiv programmering for begyndere:
Telegram bot udvikling i C# — 26.–28. august. En gratis intensiv, der giver dig mulighed for at forstå, hvordan hjælperbots fungerer, funktionerne ved at arbejde med Telegram API og andre nuancer. De tre bedste deltagere vil modtage 30 rubler fra Skillbox.

Før du starter

Vi skal udvikle en RESTful API med en grundlæggende CRUID funktionalitet.

For fuldt ud at forstå opgaven, lad os forstå de to ovennævnte udtryk.

Hvad er REST?

REST API (Representational State Transfer) er en API, der bruger HTTP-anmodninger til at udveksle data.

REST API'er skal opfylde visse kriterier:

  • Klient-server-arkitektur: klienten interagerer med brugergrænsefladen, og serveren interagerer med backend og datalager. Klienten og serveren er uafhængige, enhver af dem kan udskiftes separat fra den anden.
  • Stateless - Ingen klientdata er gemt på serveren. Sessionstilstanden gemmes på klientsiden.
  • Cachebarhed - Klienter kan cache serversvar for at forbedre den samlede ydeevne.

Hvad er CRUD?

URIGT er et programmeringskoncept, der beskriver fire grundlæggende handlinger (opret, læs, opdater og slet).

I REST API er anmodningstyper og anmodningsmetoder ansvarlige for handlinger såsom post, get, put, delete.

Nu hvor vi har fået det grundlæggende af vejen, er vi klar til at begynde at bygge API'en.

design

Lad os skabe et lager af citater om kunstig intelligens. AI er en af ​​de hurtigst voksende teknologier i dag, og Python er et populært værktøj til at arbejde med AI.

Med denne API kan en Python-udvikler hurtigt lære om AI og blive inspireret af nye præstationer. Hvis udvikleren har værdifulde tanker om dette emne, vil han være i stand til at tilføje dem til depotet.

Lad os starte med at importere de nødvendige moduler og opsætte Flask:

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

I dette uddrag er Flask, Api og Resource de klasser, vi har brug for.

Reqparse er en Flask-RESTful anmodnings-parsing-grænseflade... Du skal også bruge det tilfældige modul for at vise et tilfældigt citat.

Nu vil vi oprette et lager af citater om AI.

Hver repopost vil indeholde:

  • digitalt ID;
  • navnet på forfatteren af ​​citatet;
  • citere.

Da dette kun er et læringseksempel, vil vi gemme alle poster i en Python-liste. I en rigtig applikation ville vi højst sandsynligt bruge en database i stedet for.

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

Nu skal vi oprette en Quote-ressourceklasse, der definerer driften af ​​vores API-endepunkter. Fire metoder skal erklæres inde i klassen: get, post, put, delete.

Lad os starte med GET-metoden

Det giver dig mulighed for at få et specifikt tilbud ved at angive dets ID, eller et tilfældigt tilbud, hvis der ikke er angivet noget ID.

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 tilfældigt citat, hvis ID'et indeholder standardværdien, dvs. ved opkald var metode-id'et ikke indstillet.

Hvis den er indstillet, så søger metoden blandt anførselstegn og finder den, der indeholder det givne ID. Hvis der ikke findes noget, vises meddelelsen "Citat ikke fundet, 404".

Husk, at metoden returnerer en HTTP-status på 200, hvis anmodningen var vellykket, og 404, hvis posten ikke blev fundet.

Lad os nu oprette en POST-metode for at tilføje et nyt citat til depotet

Den får id'et for hvert nyt citat, mens du skriver. Derudover vil POST bruge reqparse til at parse de parametre, der vil gå i forespørgselsteksten (forfatter og citattekst).

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 accepterede POST-metoden et tilbuds-id. Derefter, ved hjælp af reqparse, hentede den forfatteren og citatet fra anmodningen og lagrede dem i params-ordbogen.

Hvis der allerede findes et tilbud med det angivne ID, viser metoden den relevante meddelelse og kode 400.

Hvis et tilbud med det angivne ID endnu ikke er oprettet, opretter metoden en ny post med det angivne ID og forfatter, samt andre parametre. Det tilføjer derefter en post til ai_quotes-listen og returnerer en post med et nyt citat sammen med en 201-kode.

Nu opretter vi en PUT-metode til at ændre 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, i lighed med det foregående eksempel, tager et ID og et input og analyserer citatparametrene ved hjælp af reqparse.

Hvis der findes et tilbud med det angivne ID, vil metoden opdatere det med de nye parametre og derefter udlæse det opdaterede tilbud med kode 200. Hvis der endnu ikke er et tilbud med det angivne ID, oprettes en ny post med kode 201.

Lad os endelig oprette en DELETE-metode til at fjerne et citat, der ikke længere 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 metode tager tilbuds-id'et som input og opdaterer listen over ai_quotes ved hjælp af den delte liste.

Nu hvor vi har oprettet alle metoderne, skal vi blot tilføje ressourcen til API'en, angive stien og køre Flask.

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

Vores REST API Service er klar!

Dernæst kan vi gemme koden i app.py-filen ved at køre den i konsollen med kommandoen:

python3 app.py

Hvis alt er i orden, får vi noget som dette:

* Fejlretningstilstand: tændt
* Kører videre 127.0.0.1:5000/ (Tryk på CTRL+C for at afslutte)
* Genstarter med stat
* Debugger er aktiv!
* Debugger PIN: XXXXXXX

Test af API

Efter at API'en er oprettet, skal den testes.

Dette kan gøres ved hjælp af curl-konsollen eller Insomnia REST-klienten eller ved at udgive API'et på Rapid API.

At skrive en API i Python (med Flask og RapidAPI)

Udgivelse af vores API

RapidAPI er den største markedsplads i verden med over 10 API'er (og omkring 000 million udviklere).

RapidAPI giver ikke kun en enkelt grænseflade til at arbejde med tredjeparts API'er, men giver dig også mulighed for hurtigt og nemt at udgive din egen API.

Til gør det, skal du først udgive den til en server på netværket. I vores tilfælde vil vi bruge Heroku. At arbejde med ham bør ikke forårsage nogen vanskeligheder, (du kan finde ud af mere om det her).

Sådan udgiver du din API på Heroku

1. Installer Heroku.

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

sudo snap installer heroku --classic

Så logger vi ind:

heroku login

2. Tilføj de nødvendige filer.

Nu skal vi tilføje de filer, der skal publiceres, til en mappe i vores applikation:

  • requirements.txt med en liste over nødvendige Python-moduler;
  • Procfile, som specificerer hvilke kommandoer der skal udføres for at køre applikationen;
  • .gitignore - for at udelukke filer, der ikke er nødvendige på serveren.

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

  • kolbe
  • kolbe-afslappende
  • kanonhjørning

Bemærk venligst, at vi har tilføjet gunicorn (Python WSGI HTTP Server) til listen, fordi vi skal køre vores applikation på serveren.

Profilen vil indeholde:

web: gunicorn app:app

Indhold af .gitignore:

*.pyc
__pycache__/

Nu hvor filerne er oprettet, lad os initialisere git-repoen og commit:

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

3. Opret en ny Heroku-app.

heroku create

Skub mastergrenen til den fjerntliggende Heroku-repo:

git push heroku master

Nu kan du starte med at åbne API-tjenesten med kommandoerne:

heroku ps:scale web=1
heroku open
 

API'et vil være tilgængeligt kl dit-tilfældige-heroku-navn.herokuapp.com/ai-quotes.

Sådan tilføjer du din Python API til RapidAPI-markedspladsen

Når API-tjenesten er udgivet på Heroku, kan du tilføje den til Rapid API. Her detaljeret dokumentation om dette emne.

1. Opret en RapidAPI-konto.

At skrive en API i Python (med Flask og RapidAPI)

Vi registrerer en gratis konto - dette kan gøres ved hjælp af Facebook, Google, GitHub.

At skrive en API i Python (med Flask og RapidAPI)

2. Tilføj API til kontrolpanelet.

At skrive en API i Python (med Flask og RapidAPI)

3. Indtast derefter generelle oplysninger om din API.

At skrive en API i Python (med Flask og RapidAPI)

4. Efter at have klikket på "Tilføj API" vises en ny side, hvor du kan indtaste oplysninger om vores API.

At skrive en API i Python (med Flask og RapidAPI)

5. Nu kan du enten manuelt indtaste API-endepunkterne eller downloade swagger fil ved hjælp af OpenAPI.

At skrive en API i Python (med Flask og RapidAPI)

Nå, nu skal du indstille slutpunkterne for vores API på Endpoints-siden. I vores tilfælde svarer endepunkterne til begrebet CRUD (get, post, put, delete).

At skrive en API i Python (med Flask og RapidAPI)

Dernæst skal du oprette et GET AI Quote-slutpunkt, der viser et tilfældigt tilbud (hvis ID'et er standard) eller et tilbud for det angivne ID.

For at oprette et slutpunkt skal du klikke på knappen "Opret slutpunkt".

At skrive en API i Python (med Flask og RapidAPI)

Vi gentager denne proces for alle andre API-endepunkter. Det er alt! Tillykke, du har offentliggjort din API!

Hvis alt går vel, vil API-siden se sådan ud:

At skrive en API i Python (med Flask og RapidAPI)

Konklusion

I denne artikel gennemgik vi processen med at skabe vores egen RESTful API-tjeneste i Python sammen med processen med at udgive API'et til Heroku-skyen og tilføje det til RapidAPI-biblioteket.

Men i testversionen blev kun de grundlæggende principper for API-udvikling vist - sådanne nuancer som sikkerhed, fejltolerance og skalerbarhed blev ikke taget i betragtning.

Når man udvikler en rigtig API, skal alt dette tages i betragtning.

Kilde: www.habr.com

Tilføj en kommentar