Att skriva ett API i Python (med Flask och RapidAPI)

Att skriva ett API i Python (med Flask och RapidAPI)

Om du läser den här artikeln är du förmodligen redan bekant med möjligheterna som öppnar sig när du använder API (Application Programming Interface).

Genom att lägga till en av de många offentliga API:erna i din applikation kan du utöka applikationens funktionalitet eller komplettera den med nödvändiga data. Men vad händer om du har utvecklat en unik funktion som du vill dela med samhället?

Svaret är enkelt: du behöver skapa ditt eget API.

Även om detta kan verka som en skrämmande uppgift till en början, är det faktiskt ganska enkelt. Vi visar dig hur du gör detta med Python.

Vad du behöver för att komma igång

API-utveckling kräver:

  • Python3;
  • Flask — Ett enkelt och lättanvänt ramverk för att skapa webbapplikationer.
  • Flask-VILIG är ett tillägg för Flask som låter dig utveckla ett REST API snabbt och med minimal konfiguration.

Installationen utförs med kommandot:

pip install flask-restful

Vi rekommenderar en gratis intensiv programmering för nybörjare:
Telegram botutveckling i C# — 26–28 augusti. En gratis intensiv som låter dig förstå hur hjälprobotar fungerar, funktionerna i att arbeta med Telegram API och andra nyanser. De tre bästa deltagarna kommer att få 30 000 rubel från Skillbox.

Innan du börjar

Vi kommer att utveckla ett RESTful API med en grundläggande CRUID-funktionalitet.

För att helt förstå uppgiften, låt oss förstå de två termerna som nämns ovan.

Vad är REST?

REST API (Representational State Transfer) är ett API som använder HTTP-förfrågningar för att utbyta data.

REST API:er måste uppfylla vissa kriterier:

  • Klient-serverarkitektur: klienten interagerar med användargränssnittet och servern interagerar med backend och datalagret. Klienten och servern är oberoende, vilken som helst av dem kan ersättas separat från den andra.
  • Stateless - Ingen klientdata lagras på servern. Sessionstillståndet lagras på klientsidan.
  • Cache-förmåga – Klienter kan cache-serversvar för att förbättra den övergripande prestandan.

Vad är CRUD?

SKICK är ett programmeringskoncept som beskriver fyra grundläggande åtgärder (skapa, läs, uppdatera och ta bort).

I REST API är förfrågningstyper och förfrågningsmetoder ansvariga för åtgärder som posta, hämta, lägga, ta bort.

Nu när vi har behandlat de grundläggande termerna kan vi börja skapa API:t.

utformning

Låt oss skapa ett arkiv med citat om artificiell intelligens. AI är en av de snabbast växande teknologierna idag, och Python är ett populärt verktyg för att arbeta med AI.

Med detta API kan en Python-utvecklare snabbt lära sig om AI och inspireras av nya prestationer. Om utvecklaren har värdefulla tankar om detta ämne, kommer han att kunna lägga till dem i arkivet.

Låt oss börja med att importera de nödvändiga modulerna och ställa in Flask:

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

I det här utdraget är Flask, Api och Resource de klasser vi behöver.

Reqparse är ett gränssnitt för tolkning av förfrågningar i Flask-RESTful... Du behöver också modulen slumpmässigt för att visa ett slumpmässigt citat.

Nu kommer vi att skapa ett arkiv med citat om AI.

Varje repopost kommer att innehålla:

  • digitalt ID;
  • namnet på författaren till citatet;
  • Citat.

Eftersom detta bara är ett lärande exempel kommer vi att lagra alla poster i en Python-lista. I en riktig applikation skulle vi med största sannolikhet använda en databas istället.

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 måste vi skapa en Quote-resursklass som kommer att definiera operationerna för våra API-slutpunkter. Fyra metoder måste deklareras i klassen: get, post, put, delete.

Låt oss börja med GET-metoden

Det låter dig få en specifik offert genom att ange dess ID, eller en slumpmässig offert om inget ID anges.

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 returnerar ett slumpmässigt citat om ID:t innehåller standardvärdet, dvs. ID angavs inte när metoden anropades.

Om den är inställd söker metoden bland citattecken och hittar den som innehåller det givna ID:t. Om inget hittas, visas meddelandet "Quote not found, 404".

Kom ihåg att metoden returnerar en HTTP-status på 200 om begäran lyckades och 404 om posten inte hittades.

Låt oss nu skapa en POST-metod för att lägga till ett nytt citat till förvaret

Den kommer att få id:t för varje nytt citat när du skriver. Dessutom kommer POST att använda reqparse för att analysera parametrarna som kommer att gå i förfrågningstexten (författare och citattext).

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 ovan accepterade POST-metoden ett offert-ID. Sedan, med hjälp av reqparse, hämtade den författaren och citatet från begäran och lagrade dem i params-ordboken.

Om ett citat med det angivna ID-numret redan finns, visar metoden lämpligt meddelande och kod 400.

Om ett citat med angivet ID ännu inte har skapats skapar metoden en ny post med angivet ID och författare, samt andra parametrar. Den lägger sedan till en post till ai_quotes-listan och returnerar en post med ett nytt citat tillsammans med en 201-kod.

Nu skapar vi en PUT-metod för att ändra en befintlig offert i förvaret

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, liknande det föregående exemplet, tar ett ID och en ingång och analyserar citatparametrarna med hjälp av reqparse.

Om det finns en offert med angivet ID kommer metoden att uppdatera det med de nya parametrarna och sedan mata ut det uppdaterade offertet med kod 200. Om det inte finns någon offert med angivet ID ännu skapas en ny post med kod 201.

Slutligen, låt oss skapa en DELETE-metod för att ta bort ett citat som inte längre är inspirerande.

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

Denna metod tar offert-ID som indata och uppdaterar listan med ai_quotes med den delade listan.

Nu när vi har skapat alla metoder behöver vi bara lägga till resursen i API:t, ange sökvägen och köra Flask.

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

Vår REST API-tjänst är klar!

Därefter kan vi spara koden i app.py-filen genom att köra den i konsolen med kommandot:

python3 app.py

Om allt är bra får vi något sånt här:

* Felsökningsläge: på
* Springa på 127.0.0.1:5000/ (Tryck på CTRL+C för att avsluta)
* Startar om med stat
* Debugger är aktiv!
* Felsöknings-PIN: XXXXXXX

Testar API

Efter att API har skapats måste det testas.

Detta kan göras med hjälp av verktyget Curl Console eller Insomnia REST-klienten, eller genom att publicera API:et på Rapid API.

Att skriva ett API i Python (med Flask och RapidAPI)

Publicerar vårt API

RapidAPI är den största marknadsplatsen i världen med över 10 000 API:er (och cirka 1 miljon utvecklare).

RapidAPI tillhandahåller inte bara ett enda gränssnitt för att arbeta med tredje parts API:er, utan låter dig också snabbt och enkelt publicera ditt eget API.

Till att göra dettamåste du först publicera den på någon server i nätverket. I vårt fall kommer vi att använda Heroku. Att arbeta med honom bör inte orsaka några svårigheter, (du kan ta reda på mer om det här).

Hur du publicerar ditt API på Heroku

1. Installera Heroku.

Det första steget är att registrera och installera Heroku Command Line Interface (CLI). Detta fungerar på Ubuntu 16+.

sudo snap installera heroku --classic

Då loggar vi in:

heroku-inloggning

2. Lägg till nödvändiga filer.

Nu måste vi lägga till filerna för att publicera till en mapp i vår applikation:

  • requirements.txt med en lista över nödvändiga Python-moduler;
  • Procfile, som anger vilka kommandon som måste utföras för att köra programmet;
  • .gitignore - för att utesluta filer som inte behövs på servern.

Filen requirements.txt kommer att innehålla följande rader:

  • kolv
  • kolv-vilsam
  • gevärshorn

Observera att vi har lagt till gunicorn (Python WSGI HTTP Server) till listan eftersom vi behöver köra vår applikation på servern.

Profilen kommer att innehålla:

webb: gunicorn app:app

Innehåll i .gitignore:

*.pyc
__pycache__/

Nu när filerna har skapats, låt oss initiera git-repo och commit:

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

3. Skapa en ny Heroku-app.

heroku create

Skjuta mastergrenen till det avlägsna Heroku-repoet:

git push heroku master

Nu kan du börja med att öppna API-tjänsten med kommandona:

heroku ps:scale web=1
heroku open
 

API:et kommer att finnas tillgängligt kl ditt-slumpmässiga-heroku-namn.herokuapp.com/ai-quotes.

Så här lägger du till ditt Python-API till RapidAPI-marknadsplatsen

När API-tjänsten har publicerats på Heroku kan du lägga till den i Rapid API. Här detaljerad dokumentation om detta ämne.

1. Skapa ett RapidAPI-konto.

Att skriva ett API i Python (med Flask och RapidAPI)

Vi registrerar ett gratiskonto - detta kan göras med Facebook, Google, GitHub.

Att skriva ett API i Python (med Flask och RapidAPI)

2. Lägg till API till kontrollpanelen.

Att skriva ett API i Python (med Flask och RapidAPI)

3. Ange sedan allmän information om ditt API.

Att skriva ett API i Python (med Flask och RapidAPI)

4. Efter att ha klickat på "Lägg till API" visas en ny sida där du kan ange information om vårt API.

Att skriva ett API i Python (med Flask och RapidAPI)

5. Nu kan du antingen manuellt ange API-slutpunkterna eller ladda ner swagger fil använder OpenAPI.

Att skriva ett API i Python (med Flask och RapidAPI)

Nåväl, nu måste du ställa in slutpunkterna för vårt API på sidan Endpoints. I vårt fall motsvarar ändpunkterna begreppet CRUD (get, post, put, delete).

Att skriva ett API i Python (med Flask och RapidAPI)

Därefter måste du skapa en GET AI Quote-slutpunkt som visar ett slumpmässigt citat (om ID är standard) eller en offert för det angivna ID:t.

För att skapa en slutpunkt måste du klicka på knappen "Skapa slutpunkt".

Att skriva ett API i Python (med Flask och RapidAPI)

Vi upprepar denna process för alla andra API-slutpunkter. Det är allt! Grattis, du har publicerat ditt API!

Om allt går bra kommer API-sidan att se ut ungefär så här:

Att skriva ett API i Python (med Flask och RapidAPI)

Slutsats

I den här artikeln gick vi igenom processen att skapa vår egen RESTful API-tjänst i Python, tillsammans med processen att publicera API:t till Heroku-molnet och lägga till det i RapidAPI-katalogen.

Men i testversionen visades bara de grundläggande principerna för API-utveckling - sådana nyanser som säkerhet, feltolerans och skalbarhet beaktades inte.

När man utvecklar ett riktigt API måste man ta hänsyn till allt detta.

Källa: will.com

Lägg en kommentar