Een API schrijven in Python (met Flask en RapidAPI)

Een API schrijven in Python (met Flask en RapidAPI)

Als je dit artikel leest, ben je waarschijnlijk al bekend met de mogelijkheden die het gebruik van een API (Application Programming Interface) met zich meebrengt.

Door één van de vele open API’s aan uw applicatie toe te voegen, kunt u de functionaliteit van de applicatie uitbreiden of verrijken met de benodigde data. Maar wat als u een unieke functie heeft ontwikkeld die u met de community wilt delen?

Het antwoord is simpel: je hebt het nodig maak uw eigen API.

Hoewel dit in eerste instantie misschien een moeilijke taak lijkt, is het eigenlijk eenvoudig. We laten u zien hoe u dit kunt doen met Python.

Wat je nodig hebt om te beginnen

Om een ​​API te ontwikkelen heeft u het volgende nodig:

  • Python 3;
  • Flacon — een eenvoudig en gebruiksvriendelijk raamwerk voor het maken van webapplicaties;
  • Kolf-RESTvol is een extensie voor Flask waarmee u snel en met minimale configuratie een REST API kunt ontwikkelen.

De installatie wordt uitgevoerd met het commando:

pip install flask-restful

Voor beginners raden wij een gratis intensieve programmeercursus aan:
Telegram-botontwikkeling in C# - 26-28 augustus. Een gratis intensieve cursus waarmee u begrijpt hoe assistent-bots werken, de details van het werken met de Telegram API en andere nuances. De drie beste deelnemers ontvangen 30 roebel van Skillbox.

Voordat je start

We gaan een RESTful API ontwikkelen met basic CRUID-functionaliteit.

Laten we, om de taak volledig te begrijpen, de twee hierboven genoemde termen begrijpen.

Wat is RUST?

REST API (Representational State Transfer) is een API die HTTP-verzoeken gebruikt om gegevens uit te wisselen.

REST API's moeten aan bepaalde criteria voldoen:

  • Client-server-architectuur: De client communiceert met de gebruikersinterface en de server communiceert met de backend en gegevensopslag. De client en server zijn onafhankelijk, ze kunnen allemaal afzonderlijk van de ander worden vervangen.
  • Staatloos - er worden geen klantgegevens op de server opgeslagen. De sessiestatus wordt aan de clientzijde opgeslagen.
  • Cachebaarheid - Clients kunnen serverreacties in de cache opslaan om de algehele prestaties te verbeteren.

Wat is CRUD?

WREED is een programmeerconcept dat vier basisacties beschrijft (aanmaken, lezen, bijwerken en verwijderen).

In de REST API zijn verzoektypen en verzoekmethoden verantwoordelijk voor acties zoals posten, ophalen, plaatsen en verwijderen.

Nu we de basisvoorwaarden begrijpen, kunnen we beginnen met het maken van de API.

ontwerp

Laten we een verzameling citaten over kunstmatige intelligentie creëren. AI is tegenwoordig een van de snelst groeiende technologieën en Python is een populair hulpmiddel om met AI te werken.

Met deze API kan een Python-ontwikkelaar snel informatie krijgen over AI en zich laten inspireren door nieuwe ontwikkelingen. Als een ontwikkelaar waardevolle ideeën heeft over dit onderwerp, kan hij deze aan de repository toevoegen.

Laten we beginnen met het importeren van de benodigde modules en het instellen van Flask:

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

In dit fragment zijn Flask, Api en Resource de klassen die we nodig hebben.

Reqparse is een Flask-RESTful query-parseerinterface... Je hebt ook een willekeurige module nodig om een ​​willekeurig citaat weer te geven.

Nu gaan we een verzameling citaten over AI maken.

Elke repo-invoer bevat:

  • digitale ID;
  • naam van de auteur van het citaat;
  • citaat.

Omdat dit slechts een trainingsvoorbeeld is, slaan we alle vermeldingen op in een Python-lijst. In een echte toepassing zouden we in plaats daarvan waarschijnlijk een database gebruiken.

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 moeten we een Quote-resourceklasse maken die de bewerkingen van onze API-eindpunten definieert. Binnen de klasse moet je vier methoden declareren: get, post, put, delete.

Laten we beginnen met de GET-methode

Het maakt het mogelijk om een ​​specifieke prijsopgave te krijgen door de ID op te geven, of een willekeurige prijsopgave als de ID niet is opgegeven.

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

De GET-methode retourneert een willekeurig citaat als de ID de standaardwaarde bevat, d.w.z. er is geen ID opgegeven bij het aanroepen van de methode.

Als dit is opgegeven, zoekt de methode tussen citaten en vindt degene die de opgegeven ID bevat. Als er niets wordt gevonden, wordt de melding “Quote not found, 404” weergegeven.

Let op: de methode retourneert een HTTP-status van 200 als het verzoek succesvol was en 404 als het record niet is gevonden.

Laten we nu een POST-methode maken om een ​​nieuw citaat aan de repository toe te voegen

Terwijl u typt, wordt de ID van elke nieuwe offerte opgehaald. Bovendien zal POST reqparse gebruiken om de parameters te parseren die in de hoofdtekst van het verzoek terechtkomen (auteur en citaattekst).

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

In de bovenstaande code accepteerde de POST-methode de quote-ID. Vervolgens haalde het met behulp van reqparse de auteur en het citaat uit de zoekopdracht op en sloeg deze op in het params-woordenboek.

Als er al een offerte met de opgegeven ID bestaat, geeft de methode een bijbehorend bericht en code 400 weer.

Als er nog geen citaat met het opgegeven ID is aangemaakt, maakt de methode een nieuw record aan met het opgegeven ID en de auteur, evenals andere parameters. Vervolgens wordt het item toegevoegd aan de lijst ai_quotes en wordt het item geretourneerd met het nieuwe citaat samen met een 201-code.

Nu maken we een PUT-methode om een ​​bestaande offerte in de repository te wijzigen

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

De PUT-methode, vergelijkbaar met het vorige voorbeeld, neemt ID en invoer en parseert de quote-parameters met behulp van reqparse.

Als er een bronvermelding met de opgegeven ID bestaat, zal de methode deze bijwerken met de nieuwe parameters en vervolgens de bijgewerkte bronvermelding met code 200 uitvoeren. Als er nog geen bronvermelding met de opgegeven ID is, wordt er een nieuw record met code 201 aangemaakt.

Laten we tot slot een DELETE-methode maken om een ​​citaat te verwijderen dat niet langer inspirerend is

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

Deze methode haalt de quote-ID op als invoer en werkt de lijst ai_quotes bij met behulp van de gedeelde lijst.

Nu we alle methoden hebben gemaakt, hoeven we alleen maar een bron aan de API toe te voegen, het pad in te stellen en Flask uit te voeren.

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

Onze REST API-service is klaar!

Vervolgens kunnen we de code opslaan in het app.py-bestand door deze in de console uit te voeren met de opdracht:

python3 app.py

Als alles goed is, krijgen we zoiets als dit:

* Foutopsporingsmodus: aan
* Doorlopend 127.0.0.1:5000/ (Druk op CTRL+C om te stoppen)
* Opnieuw opstarten met stat
* Debugger is actief!
* Foutopsporingspincode: XXXXXXX

Het testen van de API

Zodra de API is gemaakt, moet deze worden getest.

Dit kan worden gedaan met behulp van het curl-consolehulpprogramma of de Insomnia REST-client, of door de API op Rapid API te publiceren.

Een API schrijven in Python (met Flask en RapidAPI)

Onze API publiceren

RapidAPI is 's werelds grootste marktplaats met meer dan 10 API's (en ongeveer 000 miljoen ontwikkelaars).

RapidAPI biedt niet alleen één interface voor het werken met API's van derden, maar stelt u ook in staat snel en eenvoudig uw eigen API te publiceren.

Naar om dit te doen, moet u het eerst op een server in het netwerk publiceren. In ons geval zullen we gebruiken Heroku. Het werken ermee zou geen problemen moeten veroorzaken, (meer over hem vind je hier).

Hoe u uw API op Heroku publiceert

1. Installeer Heroku.

De eerste stap is het registreren en installeren van de Heroku Command Line Interface (CLI). Dit werkt op Ubuntu 16+.

sudo snap install heroku -klassiek

Log dan in:

heroku-login

2. Voeg de benodigde bestanden toe.

Nu moeten we bestanden toevoegen om te publiceren naar een map in onze applicatie:

  • eisen.txt met een lijst met vereiste Python-modules;
  • Procfile, dat specificeert welke opdrachten moeten worden uitgevoerd om de applicatie uit te voeren;
  • .gitignore - om bestanden uit te sluiten die niet nodig zijn op de server.

Het bestand require.txt bevat de volgende regels:

  • fles
  • kolf-rustgevend
  • geweerhoorn

Houd er rekening mee dat we gunicorn (Python WSGI HTTP Server) aan de lijst hebben toegevoegd omdat we onze applicatie op de server moeten uitvoeren.

Procbestand zal bevatten:

web: gunicorn app: app

Inhoud van .gitignore:

*.pyc
__pycache__/

Nu de bestanden zijn aangemaakt, gaan we de git repository initialiseren en committen:

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

3. Maak een nieuwe Heroku-applicatie.

heroku create

We pushen de masterbranch naar de externe Heroku-repository:

git push heroku master

Nu kunt u aan de slag door de API Service te openen met behulp van de opdrachten:

heroku ps:scale web=1
heroku open
 

De API zal beschikbaar zijn op jouw-willekeurige-heroku-naam.herokuapp.com/ai-quotes.

Hoe u uw Python API kunt toevoegen aan de RapidAPI-marktplaats

Zodra uw API-service op Heroku is gepubliceerd, kunt u deze toevoegen aan de Rapid API. Hier gedetailleerde documentatie over dit onderwerp.

1. Maak een RapidAPI-account aan.

Een API schrijven in Python (met Flask en RapidAPI)

Registreer een gratis account - dit kan gedaan worden via Facebook, Google, GitHub.

Een API schrijven in Python (met Flask en RapidAPI)

2. Voeg de API toe aan het controlepaneel.

Een API schrijven in Python (met Flask en RapidAPI)

3. Voer vervolgens algemene informatie over uw API in.

Een API schrijven in Python (met Flask en RapidAPI)

4. Nadat u op “API toevoegen” heeft geklikt, verschijnt er een nieuwe pagina waar u informatie over onze API kunt invoeren.

Een API schrijven in Python (met Flask en RapidAPI)

5. Nu kunt u de API-eindpunten handmatig invoeren of downloaden swagger-bestand met behulp van OpenAPI.

Een API schrijven in Python (met Flask en RapidAPI)

Welnu, nu moeten we de eindpunten van onze API instellen op de pagina Eindpunten. In ons geval komen eindpunten overeen met het concept van CRUD (get, post, put, delete).

Een API schrijven in Python (met Flask en RapidAPI)

Vervolgens moet u een GET AI Quote-eindpunt maken dat een willekeurig citaat weergeeft (als de ID standaard is) of een citaat voor de opgegeven ID.

Om een ​​eindpunt te maken, klikt u op de knop ‘Eindpunt maken’.

Een API schrijven in Python (met Flask en RapidAPI)

We herhalen dit proces voor alle andere API-eindpunten. Dat is alles! Gefeliciteerd, je hebt je API gepubliceerd!

Als alles goed is, ziet de API-pagina er ongeveer zo uit:

Een API schrijven in Python (met Flask en RapidAPI)

Conclusie

In dit artikel hebben we het proces geleerd van het maken van uw eigen RESTful API Service in Python, samen met het proces van het publiceren van de API naar de Heroku-cloud en het toevoegen ervan aan de RapidAPI-directory.

Maar de testversie toonde alleen de basisprincipes van API-ontwikkeling - er werd geen rekening gehouden met nuances als beveiliging, fouttolerantie en schaalbaarheid.

Bij het ontwikkelen van een echte API moet met dit alles rekening worden gehouden.

Bron: www.habr.com

Voeg een reactie