Scrive una API in Python (cù Flask è RapidAPI)

Scrive una API in Python (cù Flask è RapidAPI)

Se leghjite stu articulu, probabilmente site digià familiarizatu cù e pussibilità chì si apre quandu si usa l'API (Interfaccia di Programmazione di l'Applicazione).

Aghjunghjendu unu di i numerosi API publichi à a vostra applicazione, pudete allargà a funziunalità di sta applicazione o cumplementa cù e dati necessarii. Ma chì si avete sviluppatu una funzione unica chì vulete sparte cù a cumunità?

A risposta hè simplice: avete bisognu crea a vostra propria API.

Mentre chì questu pò sembra un compitu intimidatori in prima, hè in realtà abbastanza simplice. Vi mustraremu cumu fà questu cù Python.

Ciò chì avete bisognu per cumincià

U sviluppu di l'API richiede:

  • Python3;
  • Flask - un framework simplice è faciule d'utilizà per creà applicazioni web;
  • Flask-RESTful hè una estensione per Flask chì vi permette di sviluppà una API REST rapidamente è cù una cunfigurazione minima.

L'installazione hè fatta da u cumandimu:

pip install flask-restful

Ricumandemu una prugrammazione intensiva gratuita per i principianti:
Sviluppu di telegram bot in C# - 26-28 d'aostu. Un intensivu gratuitu chì permette di capisce cumu travaglianu i bots helper, e caratteristiche di travaglià cù l'API di Telegram è altre sfumature. I primi trè participanti riceveranu 30 000 rubli da Skillbox.

Prima di principià

Avemu da sviluppà una API RESTful cù una basa Funzionalità CRUID.

Per capiscenu cumplettamente u compitu, capiscenu i dui termini citati sopra.

Cosa hè REST?

REST API (Representational State Transfer) hè una API chì usa richieste HTTP per scambià dati.

L'API REST deve risponde à certi criterii:

  • Architettura cliente-servitore: u cliente interagisce cù l'interfaccia d'utilizatore, è u servitore interagisce cù u backend è a data store. U cliente è u servitore sò indipindenti, qualsiasi di elli pò esse rimpiazzati separatamente da l'altru.
  • Stateless - Nisuna dati di u cliente hè almacenatu in u servitore. U statu di sessione hè guardatu da u latu di u cliente.
  • Cacheability - I clienti ponu cache risposti di u servitore per migliurà u rendiment generale.

Cosa hè CRUD?

RAW hè un cuncettu di prugrammazione chì descrive quattru azzioni basi (creà, leghje, aghjurnà è sguassà).

In l'API REST, i tipi di dumanda è i metudi di dumanda sò rispunsevuli di azzioni cum'è post, get, put, delete.

Avà chì avemu trattatu cù i termini basi, pudemu cumincià à creà l'API.

Sviluppu

Creemu un repository di citazioni nantu à l'intelligenza artificiale. L'IA hè una di e tecnulugii chì cresce più rapidamente oghje, è Python hè un strumentu populari per travaglià cù AI.

Cù sta API, un sviluppatore Python pò amparà rapidamente nantu à l'IA è esse inspiratu da novi rializazioni. Se u sviluppatore hà pinsamenti preziosi nantu à questu tema, puderà aghjunghje à u repository.

Cuminciamu per impurtà i moduli necessarii è cunfigurà Flask:

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

In questu snippet, Flask, Api è Resource sò e classi chì avemu bisognu.

Reqparse hè una interfaccia di analisi di richieste Flask-RESTful... Avete ancu bisognu di u modulu aleatoriu per vede una citazione aleatoria.

Avà avemu da creà un repository di quotes about AI.

Ogni entrata repo cuntene:

  • ID digitale;
  • u nome di l'autore di a citazione;
  • citazione.

Siccomu questu hè solu un esempiu di apprendimentu, almacenaremu tutte e voci in una lista Python. In una vera applicazione, avaristi prubabilmente aduprà una basa di dati invece.

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

Avà avemu bisognu di creà una classa di risorsa Quote chì definisce l'operazioni di i nostri endpoints API. Quattru metudi deve esse dichjaratu in a classa: get, post, put, delete.

Cuminciamu cù u metudu GET

Permette di ottene una citazione specifica specificando u so ID, o una citazione aleatoria si ùn hè micca specificatu 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

U metudu GET torna una citazione aleatoria se l'ID cuntene u valore predeterminatu, i.e. quandu chjamà l'ID di metudu ùn hè micca stabilitu.

S'ellu hè stabilitu, u metudu cerca trà e virgulette è trova quellu chì cuntene l'ID datu. Se ùn si trova nunda, u missaghju "Quote not found, 404" hè visualizatu.

Ricurdativi, u metudu torna un statu HTTP di 200 se a dumanda hè successu è 404 se l'entrata ùn hè micca stata truvata.

Avà creemu un metudu POST per aghjunghje una nova citazione à u repository

Avarà l'id di ogni nova citazione mentre scrive. Inoltre, POST utilizarà reqparse per analizà i paràmetri chì andaranu in u corpu di a dumanda (autore è testu di cita).

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 u codice sopra, u metudu POST hà accettatu un ID di quotazione. Dopu, utilizendu reqparse, hà ritruvatu l'autore è cita da a dumanda, almacenendu in u dizziunariu params.

Se una citazione cù l'ID specificata esiste digià, allora u metudu mostra u missaghju appropritatu è u codice 400.

Se una citazione cù l'ID specificata ùn hè micca stata creata, u metudu crea una nova entrata cù l'ID specificatu è l'autore, è ancu altri paràmetri. Dopu aghjunghje una entrata à a lista ai_quotes è torna una entrata cù una nova citazione cù un codice 201.

Avà criemu un metudu PUT per cambià una citazione esistente in u repository

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

U metudu PUT, simile à l'esempiu precedente, piglia un ID è un input è analizeghja i paràmetri di quotazione cù reqparse.

Se una citazione cù l'ID specificatu esiste, u metudu l'aghjurnà cù i novi paràmetri è poi uscita a citazione aghjurnata cù u codice 200. Se ùn ci hè micca una citazione cù l'ID specificata, serà creatu un novu record cù u codice 201.

Infine, creemu un metudu DELETE per sguassà una citazione chì ùn hè più inspirante.

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

Stu metudu piglia l'ID di citazione cum'è input è aghjurnà a lista di ai_quotes usendu a lista sparta.

Avà chì avemu creatu tutti i metudi, tuttu ciò chì avemu da fà hè solu aghjunghje a risorsa à l'API, stabilisce a strada, è eseguisce Flask.

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

U nostru serviziu REST API hè pronta!

In seguitu, pudemu salvà u codice in u schedariu app.py eseguendu in a cunsola cù u cumandimu:

python3 app.py

Sè tuttu hè bè, allora averemu qualcosa cum'è questu:

* Modu di debug: attivatu
* Corsa avanti 127.0.0.1: 5000/ (Preme CTRL + C per esce)
* Ripartendu cù stat
* Debugger hè attivu!
* PIN Debugger: XXXXXXX

Test de l'API

Dopu chì l'API hè creatu, deve esse pruvatu.

Questu pò esse fattu cù l'utilità di cunsola curl o u cliente Insomnia REST, o publicendu l'API nantu à l'API Rapid.

Scrive una API in Python (cù Flask è RapidAPI)

Publicà a nostra API

RapidAPI hè u più grande mercatu in u mondu cù più di 10 000 API (è circa 1 milione di sviluppatori).

RapidAPI ùn solu furnisce una sola interfaccia per travaglià cù API di terzu, ma permette ancu di publicà rapidamente è facilmente a vostra propria API.

à fa la, prima avete bisognu di pubblicà à qualchì servitore in a reta. In u nostru casu, avemu aduprà Heroku. U travagliu cun ellu ùn deve micca causà difficultà, (pudete truvà più nantu à questu quì).

Cumu pubblicà a vostra API in Heroku

1. Installa Heroku.

U primu passu hè di registrà è installate l'interfaccia Heroku Command Line (CLI). Questu funziona nantu à Ubuntu 16+.

sudo snap install heroku --classic

Dopu avemu login:

login heroku

2. Aggiungi i schedari nicissariu.

Avà avemu bisognu di aghjunghje i fugliali da publicà in un cartulare in a nostra applicazione:

  • requirements.txt cù una lista di moduli Python richiesti;
  • Procfile, chì specifica quali cumandamenti deve esse eseguitu per eseguisce l'applicazione;
  • .gitignore - per escludiri i schedarii chì ùn sò micca necessariu in u servitore.

U schedariu requirements.txt cuntene e seguenti linee:

  • frasca
  • fiasco-riposu
  • gunicornu

Per piacè nutate chì avemu aghjustatu gunicorn (Server HTTP Python WSGI) à a lista perchè avemu bisognu di eseguisce a nostra applicazione nantu à u servitore.

U prufilu cuntene:

web: gunicorn app:app

Cuntenutu di .gitignore:

*.pyc
__pycache__/

Avà chì i fugliali sò creati, inizializemu u git repo è commit:

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

3. Crea una nova app Heroku.

heroku create

Spingendu u ramu maestru à u repo Heroku remoto:

git push heroku master

Avà pudete inizià apre u serviziu API cù i cumandamenti:

heroku ps:scale web=1
heroku open
 

L'API serà dispunibule à u vostru-random-heroku-name.herokuapp.com/ai-quotes.

Cumu aghjunghje a vostra API Python à u mercatu RapidAPI

Quandu u serviziu API hè publicatu nantu à Heroku, pudete aghjunghje à l'API Rapid. Quì documentazione dettagliata nantu à questu tema.

1. Crea un contu RapidAPI.

Scrive una API in Python (cù Flask è RapidAPI)

Avemu registratu un contu gratuitu - questu pò esse fattu cù Facebook, Google, GitHub.

Scrive una API in Python (cù Flask è RapidAPI)

2. Add API à u pannellu di cuntrollu.

Scrive una API in Python (cù Flask è RapidAPI)

3. Dopu, entre infurmazione generale nantu à a vostra API.

Scrive una API in Python (cù Flask è RapidAPI)

4. Dopu à cliccà "Add API" una nova pagina cumparisce induve pudete inserisce infurmazione nantu à a nostra API.

Scrive una API in Python (cù Flask è RapidAPI)

5. Avà vi ponu sia entre manually i punti finali API, o scaricà u schedariu swagger usendu OpenAPI.

Scrive una API in Python (cù Flask è RapidAPI)

Ebbè, avà avete bisognu di stabilisce l'endpoints di a nostra API in a pagina Endpoints. In u nostru casu, l'endpoints currispondenu à u cuncettu di CRUD (get, post, put, delete).

Scrive una API in Python (cù Flask è RapidAPI)

In seguitu, avete bisognu di creà un puntu finale GET AI Quote chì mostra una citazione aleatoria (se l'ID hè predeterminatu) o una citazione per l'ID specificata.

Per creà un endpoint, avete bisognu di cliccà u buttone "Crea Endpoint".

Scrive una API in Python (cù Flask è RapidAPI)

Ripitemu stu prucessu per tutti l'altri endpoint API. Eccu tuttu! Felicitazioni, avete publicatu u vostru API!

Se tuttu va bè, a pagina di l'API serà simile à questu:

Scrive una API in Python (cù Flask è RapidAPI)

cunchiusioni

In questu articulu, avemu passatu u prucessu di creà u nostru propiu RESTful API Service in Python, cù u prucessu di pubblicà l'API à u nuvulu Heroku è aghjunghje à u repertoriu RapidAPI.

Ma in a versione di prova, solu i principii basi di u sviluppu di l'API sò stati dimustrati - tali sfumature cum'è a sicurità, a toleranza di difetti è a scalabilità ùn sò micca cunsiderate.

Quandu si sviluppa una vera API, tuttu questu deve esse cunsideratu.

Source: www.habr.com

Add a comment