Scriem API pe Python (cu Flask și RapidAPI)

Scriem API pe Python (cu Flask și RapidAPI)

Dacă citiți acest articol, probabil că sunteți deja familiarizați cu posibilitățile deschise prin utilizarea API-ului (Interfața de Programare a Aplicațiilor).

Adăugând în aplicația dumneavoastră unul dintre numeroasele API-uri deschise, puteți extinde funcționalitatea acesteia sau o puteți completa cu datele necesare. Dar ce este de făcut dacă ați dezvoltat o funcție unică pe care doriți să o împărtășiți cu comunitatea?

Răspunsul este simplu: trebuie să creați un API propriu.

Deși la început poate părea o sarcină complicată, de fapt este simplu. Vă vom arăta cum să faceți acest lucru folosind Python.

Ce este necesar pentru a începe

Pentru dezvoltarea API-ului sunt necesare:

  • Python 3;
  • Flask — un framework simplu și ușor de utilizat pentru crearea aplicațiilor web;
  • Flask-RESTful — o extensie pentru Flask, care permite dezvoltarea rapidă a unui API REST cu o configurare minimă.

Instalarea se face cu comanda:

pip install flask-restful

Vă recomandăm un curs intensiv gratuit de programare pentru începători:
Dezvoltarea unui bot Telegram în C# — 26-28 august. Un curs intensiv gratuit care vă ajută să înțelegeți cum funcționează asistenții virtuali, particularitățile interacțiunii cu API-ul Telegram și alte nuanțe. Cei mai buni trei participanți vor primi de la Skillbox 30.000 de ruble..

Înainte de a începe

Ne propunem să dezvoltăm un API RESTful cu funcționalitate de bază CRUD.

Pentru a înțelege complet sarcina, să clarificăm două termeni menționați mai sus.

Ce este REST?

REST API (Transferul de Stare Reprezentativ) este un API care folosește cereri HTTP pentru a schimba date.

REST API-urile trebuie să respecte anumite criterii:

  • Arhitectura client-server: clientul interacționează cu interfața utilizatorului, iar serverul cu backend-ul și stocarea datelor. Clientul și serverul sunt independente, oricare dintre ele poate fi înlocuit separat de cealaltă.
  • Stateless — nicio dată a clientului nu este salvată pe server. Starea sesiuni este păstrată pe partea clientului.
  • Cache-abilitate — clienții pot să stocheze în cache răspunsurile serverului pentru a îmbunătăți performanța generală.

Ce este CRUD?

CRUD — o conceptie de programare care descrie cele patru acțiuni fundamentale (create, read, update și delete).

În REST API-uri, tipurile de cereri și metodele de cerere corespund acțiunilor precum post, get, put, delete.

Acum că am clarificat termenii de bază, putem începe să creăm API-ul.

Dezvoltare

Să creăm un repository de citate despre inteligența artificială. IA este una dintre cele mai rapid dezvoltate tehnologii de astăzi, iar Python este un instrument popular pentru lucrul cu IA.

Cu acest API, dezvoltatorul Python va putea obține rapid informații despre IA și se va inspira din realizările noi. Dacă dezvoltatorul are idei valoroase pe această temă, va putea să le adauge în repository.

Să începem cu importul modulelor necesare și configurarea Flask:

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

În acest snippet Flask, Api și Resource sunt clasele de care avem nevoie.

Reqparse este o interfață de parsing a cererilor Flask-RESTful… De asemenea, se va folosi modulul random pentru a afișa o citație aleatorie.

Acum vom crea repository-ul de citate despre IA.

Fiecare înregistrare din repo va conține:

  • un ID digital;
  • numele autorului citației;
  • citația.

Deoarece acesta este doar un exemplu didactic, vom salva toate înregistrările într-o listă Python. Într-o aplicație reală, pe de altă parte, cel mai probabil am folosi o bază de date.

ai_quotes = [
    {
        "id": 0,
        "author": "Kevin Kelly",
        "quote": "Planurile de afaceri ale următoarelor 10.000 de startup-uri sunt ușor de prognozat: " +
                 "Ia X și adaugă AI."
    },
    {
        "id": 1,
        "author": "Stephen Hawking",
        "quote": "Dezvoltarea unei inteligențe artificiale complete ar putea " +
                 "însemna sfârșitul rasei umane… " +
                 "Ar lua-o pe cont propriu și s-ar reproiecta " +
                 "într-un ritm tot mai rapid. " +
                 "Oamenii, care sunt limitați de evoluția biologică lentă, " +
                 "nu ar putea concura și ar fi depășiți."
    },
    {
        "id": 2,
        "author": "Claude Shannon",
        "quote": "Îmi imaginez o vreme când vom fi pentru roboți ceea ce " +
                 "sunt câinii pentru oameni, " +
                 "și țin cu mașinile."
    },
    {
        "id": 3,
        "author": "Elon Musk",
        "quote": "Ritmul progresului în inteligența artificială " +
                 "(nu mă refer la AI îngust) " +
                 "este incredibil de rapid. Dacă nu ai o expunere directă " +
                 "la grupuri precum Deepmind, " +
                 "nu ai idee cât de repede — crește " +
                 "la un ritm apropiat de exponențial. " +
                 "Riscul ca ceva cu adevărat periculos " +
                 "să se întâmple se află în intervalul de cinci ani. " +
                 "10 ani, cel mult."
    },
    {
        "id": 4,
        "author": "Geoffrey Hinton",
        "quote": "Am fost întotdeauna convins că singura modalitate " +
                 "de a face inteligența artificială să funcționeze " +
                 "este să facem calculul într-un mod similar cu creierul uman. " +
                 "Aceasta este ținta pe care o urmăresc. Facem progrese, " +
                 "deși mai avem multe de învățat despre " +
                 "cum funcționează efectiv creierul."
    },
    {
        "id": 5,
        "author": "Pedro Domingos",
        "quote": "Oamenii se tem că computerele vor " +
                 "deveni prea inteligente și vor prelua controlul asupra lumii, " +
                 "dar adevărata problemă este că sunt prea prosti " +
                 "și deja au preluat controlul asupra lumii."
    },
    {
        "id": 6,
        "author": "Alan Turing",
        "quote": "Se pare că este probabil ca odată ce metoda de gândire a mașinii " +
                 "a fost începută, nu va dura mult " +
                 "până va depăși puterile noastre slabe… " +
                 "Ele vor putea să converseze " +
                 "între ele pentru a-și ascuți inteligența. " +
                 "Așadar, într-o anumită etapă, ar trebui " +
                 "să ne așteptăm ca mașinile să preia controlul."
    },
    {
        "id": 7,
        "author": "Ray Kurzweil",
        "quote": "Inteligența artificială va atinge " +
                 "niveluri umane în jurul anului 2029. " +
                 "Dacă urmărim mai departe, să zicem, 2045, " +
                 "vom fi înmulțit inteligența, " +
                 "inteligența mașinilor biologice umane " +
                 "a civilizației noastre de o miliardă de ori."
    },
    {
        "id": 8,
        "author": "Sebastian Thrun",
        "quote": "Nimeni nu o formulează în acest fel, dar cred " +
                 "că inteligența artificială " +
                 "este aproape o disciplină umanistă. Este cu adevărat o încercare " +
                 "de a înțelege inteligența umană și cogniția umană."
    },
    {
        "id": 9,
        "author": "Andrew Ng",
        "quote": "Facem această analogie că AI este noua electricitate." +
                 "Electricitatea a transformat industriile: agricultură, " +
                 "transport, comunicare, manufactură."
    }
]

Acum trebuie să creăm clasa resursă Quote, care va defini operațiile endpoint-urilor API-ului nostru. În interiorul clasei, trebuie să declarăm patru metode: get, post, put, delete.

Să începem cu metoda GET

Aceasta oferă posibilitatea de a obține o citat specific, specificând ID-ul său, sau o citat aleatorie, dacă ID-ul nu este specificat.

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 "Citatul nu a fost găsit", 404

Metoda GET returnează o citat aleatorie, dacă ID-ul are valoarea implicită, adică atunci când metoda este apelată, ID-ul nu a fost specificat.

Dacă este specificat, metoda caută printre citate și găsește pe cea care conține ID-ul specificat. Dacă nu găsește nimic, se afișează mesajul "Citatul nu a fost găsit, 404".

Rețineți: metoda returnează un status HTTP 200 în caz de cerere reușită și 404, dacă înregistrarea nu a fost găsită.

Acum să creăm metoda POST pentru a adăuga o nouă citat în repository.

Aceasta va primi identificatorul fiecărei noi citate la introducere. În plus, POST va utiliza reqparse pentru a analiza parametrii care vor fi trimiși în corpul cererii (autorul și textul citatului).

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"Citatul cu id {id} există deja", 400
      quote = {
          "id": int(id),
          "author": params["author"],
          "quote": params["quote"]
      }
      ai_quotes.append(quote)
      return quote, 201

În codul de mai sus, metoda POST a preluat ID-ul citatului. Apoi, folosind reqparse, a obținut autorul și citatul din cerere, salvându-le în dicționarul params.

Dacă citatul cu ID-ul specificat există deja, metoda returnează un mesaj corespunzător și codul 400.

Dacă citatul cu ID-ul specificat nu a fost creat încă, metoda creează un nou record cu ID-ul și autorul specificate, precum și celelalte parametrii. Apoi adaugă recordul în lista ai_quotes și returnează recordul cu noul citat împreună cu codul 201.

Acum creăm metoda PUT pentru a modifica o citat existent în 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

Metoda PUT, similar cu exemplul anterior, preia ID-ul și inputul și analizează parametrii citatului, folosind reqparse.

Dacă citatul cu ID-ul specificat există, metoda îl va actualiza cu noile parametrii, iar apoi va returna citatul actualizat cu codul 200. Dacă citatul cu ID-ul specificat nu există încă, va fi creată o nouă înregistrare cu codul 201.

În final, să creăm metoda DELETE pentru a elimina citatul care nu mai inspiră.

def delete(self, id):
      global ai_quotes
      ai_quotes = [quote for quote in ai_quotes if quote["id"] != id]
      return f"Citatul cu id {id} a fost șters.", 200

Această metodă primește ID-ul citatului la intrare și actualizează lista ai_quotes, folosind lista globală.

Acum, când am creat toate metodele, tot ce trebuie să facem este să adăugăm resursa la API, să stabilim calea și să lansăm Flask.

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

Serviciul nostru REST API este gata!

Apoi putem salva codul într-un fișier app.py, rulându-l în consolă cu comanda:

python3 app.py

Dacă totul este bine, atunci vom obține ceva de genul acesta:

* Mod de depanare: activat
* Rulăm pe 127.0.0.1:5000\/ (Apăsați CTRL+C pentru a ieși)
* Restartare cu stat
* Depanatorul este activ!
* PIN-ul depanatorului: XXXXXXX

Testăm API-ul.

După ce API-ul este creat, acesta trebuie testat.

Acest lucru poate fi realizat prin intermediul utilitarului de consolă curl sau al clientului Insomnia REST sau publicând API-ul pe Rapid API.

Scriem API pe Python (cu Flask și RapidAPI)

Publicăm API-ul nostru.

RapidAPI este cea mai mare piață din lume cu peste 10.000 de API-uri (și aproape 1 milion de dezvoltatori).

RapidAPI nu oferă doar o interfață unificată pentru a lucra cu API-uri externe, ci și posibilitatea de a publica rapid și ușor propriul API.

Pentru a face acest lucru, mai întâi trebuie să-l publicăm pe un server din rețea. În cazul nostru, vom folosi Heroku. Lucrul cu acesta nu ar trebui să cauzeze dificultăți, (puteți afla mai multe despre el aici).

Cum să publicați API-ul dvs. pe Heroku.

1. Instalăm Heroku.

Primul pas este să vă înregistrați și să instalați Heroku Command Line Interface (CLI). Acesta funcționează pe Ubuntu 16+.

sudo snap install heroku --classic

Apoi ne logăm:

heroku login

2. Adăugăm fișierele necesare.

Acum trebuie să adăugăm fișierele de publicat în dosarul aplicației noastre:

  • requirements.txt cu lista modulelor Python necesare;
  • Procfile, care indică ce comenzi trebuie să fie executate pentru a lansa aplicația;
  • .gitignore — pentru excluziunea fișierelor care nu sunt necesare pe server.

Fișierul requirements.txt va conține următoarele linii:

  • flask
  • flask-restful
  • gunicorn

Vă rugăm să rețineți: am adăugat gunicorn (Python WSGI HTTP Server) pe lista, deoarece trebuie să rulăm aplicația noastră pe server.

Procfile va conține:

web: gunicorn app:app

Conținutul .gitignore:

*.pyc
__pycache__/

Acum că fișierele sunt create, să inițializăm un repo git și să facem un commit:

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

3. Creăm o nouă aplicație Heroku.

heroku create

Trimitem ramura master în repo-ul remote Heroku:

git push heroku master

Acum putem începe, deschizând API Service folosind comenzile:

heroku ps:scale web=1
heroku open
 

API-ul va fi disponibil la adresa your-random-heroku-name.herokuapp.com/ai-quotes.

Cum să adăugați API-ul vostru Python pe marketplace-ul RapidAPI

După ce API Service a fost publicat pe Heroku, puteți să-l adăugați la Rapid API. Aici documentația detaliată pe acest subiect.

1. Creăm un cont RapidAPI.

Scriem API pe Python (cu Flask și RapidAPI)

Înscrierea unei conturi gratuite — se poate face folosind Facebook, Google, GitHub.

Scriem API pe Python (cu Flask și RapidAPI)

2. Adăugăm API-ul în panoul de control.

Scriem API pe Python (cu Flask și RapidAPI)

3. Apoi introducem informațiile generale despre API-ul nostru.

Scriem API pe Python (cu Flask și RapidAPI)

4. După ce apăsați “Add API”, apare o pagină nouă unde puteți introduce informațiile despre API-ul nostru.

Scriem API pe Python (cu Flask și RapidAPI)

5. Acum puteți fie să introduceți manual endpoint-urile API, fie să încărcați swagger-file prin OpenAPI.

Scriem API pe Python (cu Flask și RapidAPI)

Apoi trebuie să definim endpoint-urile API-ului nostru pe pagina Endpoints. În cazul nostru, endpoint-urile corespund conceptului CRUD (get, post, put, delete).

Scriem API pe Python (cu Flask și RapidAPI)

Apoi trebuie să creăm un endpoint GET AI Quote, care returnează o citat aleatorie (dacă ID-ul este implicit) sau un citat pentru ID-ul specificat.

Pentru a crea un endpoint, trebuie să apăsați butonul “Create Endpoint”.

Scriem API pe Python (cu Flask și RapidAPI)

Repetați acest proces pentru toate celelalte endpoint-uri ale API-ului. Asta e tot! Felicitări, ați publicat API-ul vostru!

Dacă totul este bine, pagina API va arăta cam așa:

Scriem API pe Python (cu Flask și RapidAPI)

Concluzie

În acest articol, am explorat procesul de creare a unui serviciu RESTful API pe Python, împreună cu procesul de publicare a API-ului în cloud-ul Heroku și adăugarea acestuia în catalogul RapidAPI.

Dar în varianta de test au fost prezentate doar principiile de bază ale dezvoltării API-ului — aspecte precum securitatea, reziliența și scalabilitatea nu au fost abordate.

Când dezvoltați un API real, toate acestea trebuie luate în considerare.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster