Po shkruajmë API në Python (me Flask dhe RapidAPI)

Po shkruajmë API në Python (me Flask dhe RapidAPI)

Nëse po e lexoni këtë artikull, ndoshta jeni të njohur tashmë me mundësitë që ofron përdorimi i API (Interface Programimi Aplikacionesh).

Duke shtuar në aplikacionin tuaj një nga shumë API të hapura, mund të zgjeroni funksionalitetin e këtij aplikacioni ose ta pasuroni atë me të dhëna të nevojshme. Por çfarë ndodh nëse keni zhvilluar një funksionalitet unik që dëshironi ta ndani me komunitetin?

Përgjigja është e thjeshtë: duhet të krijoni një API të vetin.

Megjithatë, edhe pse kjo duket si një detyrë e vështirë në fillim, në fakt është mjaft e thjeshtë. Ne do t'ju tregojmë se si ta bëni këtë me Python.

ÇfarĂ« Ă«shtĂ« e nevojshme pĂ«r tĂ« filluar

Për zhvillimin e një API nevojiten:

  • Python 3;
  • Flask — njĂ« framework i thjeshtĂ« dhe i lehtĂ« pĂ«r t'u pĂ«rdorur pĂ«r krijimin e aplikacioneve web;
  • Flask-RESTful — njĂ« zgjatje pĂ«r Flask, e cila lejon zhvillimin e API REST shpejt dhe me njĂ« konfigurim minimal.

Instalimi bëhet me komandën:

pip install flask-restful

Kemi përkrahur një intensivi falas në programim për fillestarët:
Zhvillimi i njĂ« boti telegram nĂ« C# — 26–28 gusht. Intensivi falas, qĂ« ndihmon pĂ«r t'u njohur me mĂ«nyrĂ«n sesi funksionojnĂ« botĂ« tĂ« ndihmĂ«sit, nĂ« veçoritĂ« e punĂ«s me API tĂ« Telegramit dhe kĂ«ndvĂ«shtrime tĂ« tjera. Tre pjesĂ«marrĂ«sit mĂ« tĂ« mirĂ« do tĂ« marrin nga 30 000 rubla nga Skillbox..

Para se të filloni

Ne jemi duke planifikuar të zhvillojmë një API RESTful me funksionalitet CRUID të bazës.

Për të kuptuar plotësisht detyrën, le të shqyrtojmë dy terma të përmendur më sipër.

ÇfarĂ« Ă«shtĂ« REST?

REST API (Transferim i Gjendjes PĂ«rfaqĂ«suese) — Ă«shtĂ« njĂ« API qĂ« pĂ«rdor kĂ«rkesa HTTP pĂ«r shkĂ«mbimin e tĂ« dhĂ«nave.

REST API duhet të përmbushin disa kritere:

  • Arkitektura klient-server: klienti nd interacts with the user interface while the server interacts with the backend and data storage. The client and server are independent, either can be replaced separately from the other.
  • Stateless — asnjĂ« tĂ« dhĂ«nat e klientit nuk ruhen nĂ« server. Gjendja e sesionit ruhet nĂ« anĂ«n e klientit.
  • Cacheability — klientĂ«t mund tĂ« ruajnĂ« pĂ«rgjigjet e serverit pĂ«r tĂ« pĂ«rmirĂ«suar performancĂ«n e pĂ«rgjithshme.

ÇfarĂ« Ă«shtĂ« CRUD?

CRUD — njĂ« koncept programimi qĂ« pĂ«rshkruan katĂ«r veprime themelore (krijo, lexoni, pĂ«rditĂ«soni dhe fshini).

Në API REST, llojet e kërkesave dhe metodat e kërkesave përgjigjen për veprime të tilla si post, merr, vendos, fshi.

Tani që kemi kuptuar terminologjinë e bazës, mund të fillojmë krijimin e API.

Zhvillimi

Le të krijojmë një depotë citatash për inteligjencën artificiale. IA është një nga teknologjitë që po zhvillohet më shpejt sot, dhe Python është një mjet popullor për punën me IA.

Me këtë API, zhvilluesi i Python-it do të jetë në gjendje të marrë shpejt informacion rreth IA-së dhe të frymëzohet nga arritjet e reja. Nëse zhvilluesi ka mendime të vlefshme mbi këtë temë, ai do të ketë mundësi t'i shtojë ato në depotë.

Le të fillojmë me importimin e moduleve të nevojshme dhe konfigurimin e Flask:

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

Në këtë snippeti Flask, Api dhe Resource janë klasat që na nevojiten.

Reqparse është një ndërfaqe për analizimin e kërkesave në Flask-RESTful
 Moduli random gjithashtu do të nevojitet për të shfaqur një citat të rastësishëm.

Tani do të krijojmë një depotë citatash për IA.

Çdo rekord i depotĂ« do tĂ« pĂ«rmbajĂ«:

  • ID dixhital;
  • emri i autorit tĂ« citatit;
  • citin.

Duke qenë se kjo është vetëm një shembull për mësim, ne do t'i ruajmë të gjitha rekordet në një listë Python. Në një aplikacion real, gjithsesi, ne më shumë do të përdornim një bazë të dhënash.

ai_quotes = [
    {
        "id": 0,
        "author": "Kevin Kelly",
        "quote": "Planet biznes i 10,000 startupeve të ardhshëm janë të lehtë për t'u parashikuar: " +
                 "Merrni X dhe shtoni AI."
    },
    {
        "id": 1,
        "author": "Stephen Hawking",
        "quote": "Zhvillimi i inteligjencës artificiale të plotë mund " +
                 "të shënojë fundit e racës njerëzore
 " +
                 "Ajo do të ndjekë rrugën e saj, dhe do të ripërpunojë " +
                 "vetveten me një ritëm gjithnjë e në rritje. " +
                 "Njerëzit, të cilët janë të kufizuar nga evolucionin e ngadaltë biologjik, " +
                 "nuk do të mund të konkurrojnë, dhe do të zëvendësohen."
    },
    {
        "id": 2,
        "author": "Claude Shannon",
        "quote": "E imagjinoj një kohë kur ne do të jemi për robotët atë që " +
                 "qentë janë për njerëzit, " +
                 "dhe unë jam në anën e makinave."
    },
    {
        "id": 3,
        "author": "Elon Musk",
        "quote": "Përshpejtimi i përparimit në inteligjencën artificiale " +
                 "(nuk po i referohem AI të ngushtë) " +
                 "është jashtëzakonisht i shpejtë. Nëse nuk keni ekspozitë direkte " +
                 "me grupe si Deepmind, " +
                 "nuk keni ide se sa shpejt – po rritet " +
                 "me një ritëm të afërt me eksponencialin. " +
                 "Rreziku i diçkaje serioze të dëmshme " +
                 "duhet pritur brenda pesë viteve." +
                 "10 vite maksimumi."
    },
    {
        "id": 4,
        "author": "Geoffrey Hinton",
        "quote": "Unë gjithmonë kam qenë i bindur se mënyra e vetme " +
                 "për të bërë që inteligjenca artificiale të funksionojë " +
                 "është të bëhet llogaritja në një mënyrë të ngjashme me trurin njerëzor. " +
                 "Ky është qëllimi që kam ndjekur. Po bëjmë përparim, " +
                 "ndonëse ende kemi shumë për të mësuar mbi " +
                 "se si funksionon në të vërtetë truri."
    },
    {
        "id": 5,
        "author": "Pedro Domingos",
        "quote": "Njerëzit shqetësohen që kompjuterët do " +
                 "të bëhen shumë të zgjuar dhe do të marrin kontrollin e botës, " +
                 "por problemi i vërtetë është se ata janë shumë të budallenj " +
                 "dhe ata tashmë e kanë marrë kontrollin e botës."
    },
    {
        "id": 6,
        "author": "Alan Turing",
        "quote": "Duket e mundshme që njëherë metoda e mendimit " +
                 "nga makina ka filluar, nuk do të marrë shumë kohë " +
                 "për të përshkuar fuqitë tona të dobëta
 " +
                 "Ato do të jenë në gjendje të bisedojnë " +
                 "me njëra-tjetrën për të sharpen mendjet e tyre. " +
                 "Në një moment, prandaj, ne do " +
                 "të duhet të presim që makinat të marrin kontrollin."
    },
    {
        "id": 7,
        "author": "Ray Kurzweil",
        "quote": "Inteligjenca artificiale do të arrijë " +
                 "niveli njerëzor diku rreth vitit 2029. " +
                 "Nëse e ndjekim më tej deri në vitin 2045, " +
                 "ne do të kemi shumëfishuar inteligjencën, " +
                 "inteligjencën biologjike të makinave njerëzore " +
                 "të civilizimit tonë një miliardfish."
    },
    {
        "id": 8,
        "author": "Sebastian Thrun",
        "quote": "Askush nuk e shpreh atë në këtë mënyrë, por mendoj " +
                 "që inteligjenca artificiale " +
                 "Ă«shtĂ« pothuajse njĂ« disiplinĂ« humane. ËshtĂ« vĂ«rtet njĂ« pĂ«rpjekje " +
                 "për të kuptuar inteligjencën njerëzore dhe njohjen njerëzore."
    },
    {
        "id": 9,
        "author": "Andrew Ng",
        "quote": "Ne po bëjmë këtë analogji që AI është energjia e re." +
                 "Energjia transformoi industritë: bujqësia, " +
                 "transporti, komunikimi, prodhimi."
    }
]

Tani është koha për të krijuar një klasë burimi Quote, e cila do të përcaktojë operacionet e endpoint-eve të API-t tonë. Brenda klasës, duhen shpallur katër metoda: get, post, put, delete.

Le të fillojmë me metodën GET

Kjo ofron mundësinë për të marrë një citat të caktuar duke treguar ID-në e tij ose një citat të rastësishëm, nëse ID nuk është e specifikuar.

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 "Cita nuk u gjet", 404

Metoda GET kthen një citat të rastësishëm, nëse ID ka vlerën default, dmth. kur metoda thirret, ID nuk është specifikuar.

NĂ«se ajo Ă«shtĂ« specifikuar, metoda kĂ«rkon nĂ«pĂ«r citate dhe gjen atĂ« qĂ« ka ID-nĂ« e kĂ«rkuar. NĂ«se nuk gjendet asgjĂ«, shfaqet mesazhi “Cita nuk u gjet, 404”.

Kujtoni: metoda kthen statusin HTTP 200 në rast të një kërkese të suksesshme dhe 404 nëse regjistrimi nuk u gjet.

Tani le të krijojmë metodën POST për të shtuar një citat të ri në depo

Ajo do të marrë identifikuesin e çdo citati të ri gjatë hyrjes. Për më tepër, POST do të përdorë reqparse për të analizuar parametrat që do të vijnë në trupin e kërkesës (autori dhe teksti i citatit).

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"Cita me id {id} ekziston tashmë", 400
      quote = {
          "id": int(id),
          "author": params["author"],
          "quote": params["quote"]
      }
      ai_quotes.append(quote)
      return quote, 201

Në kodin më sipër, metoda POST mori ID-në e citatit. Më pas, duke përdorur reqparse, ajo mori autorin dhe citatin nga kërkesa, duke i ruajtur ato në një fjalor params.

Nëse citati me ID-në e specifikuar tashmë ekziston, metoda shfaq një mesazh përkatës dhe kodin 400.

Nëse citati me ID-në e specifikuar nuk është krijuar ende, metoda krijon një regjistrim të ri me ID-në, autorin, si dhe parametrat e tjerë. Pastaj e shton regjistrimin në listën ai_quotes dhe kthen regjistrimin me citatin e ri së bashku me kodin 201.

Tani krijojmë metodën PUT për të ndryshuar një citat ekzistues në depo

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, ashtu si në shembullin e mëparshëm, merr ID-në dhe inputin dhe analizon parametrat e citatës, duke përdorur reqparse.

Nëse citata me ID-në e caktuar ekziston, metoda do ta përditësojë atë me parametrat e rinj dhe më pas do të kthejë citatën e përditësuar me kodin 200. Nëse citata me ID-në e caktuar nuk ekziston ende, do të krijohet një regjistrim i ri me kodin 201.

Së fundmi, le të krijojmë një metodë DELETE për të fshirë citatën që nuk na frymëzon më.

def delete(self, id):
      global ai_quotes
      ai_quotes = [qoute for qoute in ai_quotes if qoute["id"] != id]
      return f"Citat me id {id} është fshirë.", 200

Kjo metodë merr ID-në e citatës kur futet dhe përditëson listën ai_quotes, duke përdorur listën globale.

Tani që kemi krijuar të gjitha metodat, gjithë çfarë na mbetet është ta shtojmë burimin në API, të përcaktojmë rrugën dhe të nisim Flask.

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

Shërbimi ynë REST API është gati!

Më pas mund të ruajmë kodin në një skedar app.py, duke e nisur atë në konsolë përmes komandës:

python3 app.py

Nëse gjithçka shkon mirë, do të marrim diçka të tillë:

* Modaliteti i debugging: aktiv
* Po ekzekutohet në 127.0.0.1:5000\/ (Shtypni CTRL+C për të dalë)
* Po restartohet me stat
* Debugger është aktiv!
* PIN-i i debugger-it: XXXXXXX

Testojmë API-në.

Pasi API-ja është krijuar, duhet ta testojmë atë.

Kjo mund të bëhet përmes utilitarit të konsolës curl ose klientit Insomnia REST ose duke publikuar API-në në Rapid API.

Po shkruajmë API në Python (me Flask dhe RapidAPI)

Publikojmë API-në tonë.

RapidAPI është tregu më i madh në botë me më shumë se 10,000 API (dhe rreth 1 milion zhvillues).

RapidAPI jo vetëm që ofron një ndërfaqe të vetme për të punuar me API-të e tjera, por gjithashtu jep mundësinë për ta publikuar API-në tuaj shpejt dhe pa probleme.

Për të për ta bërë këtë, fillimisht duhet ta publikoni atë në ndonjë server në rrjet. Në rastin tonë do të përdorim Heroku. Puna me të nuk duhet të sjellë ndonjë vështirësi, (mund të mësoni më shumë për të këtu).

Si ta publikoni API-në tuaj në Heroku

1. Instaloni Heroku.

Së pari duhet të regjistroheni dhe të instaloni Heroku Command Line Interface (CLI). Kjo funksionon në Ubuntu 16+.

sudo snap install heroku —classic

Pastaj, bëjmë login:

heroku login

2. Shtojmë skedarët e nevojshëm.

Tani duhet të shtoni skedarë për publikim në dosjen e aplikacionit tonë:

  • requirements.txt me listĂ«n e moduleve tĂ« nevojshme Python;
  • Procfile, i cili pĂ«rcakton cilat komanda duhet tĂ« ekzekutohen pĂ«r tĂ« nisur aplikacionin;
  • .gitignore — pĂ«r tĂ« pĂ«rjashtuar skedarĂ«t qĂ« nuk nevojiten nĂ« server.

Skedari requirements.txt do të përmbajë rreshtat e mëposhtëm:

  • flask
  • flask-restful
  • gunicorn

Ju lutemi, vini re se ne kemi shtuar gunicorn (Python WSGI HTTP Server) në listë, pasi duhet të fillojmë aplikacionin tonë në server.

Procfile do të përmbajë:

web: gunicorn app:app

Përmbajtja e .gitignore:

*.pyc
__pycache__/

Tani, pas krijimit të skedave, le të inicializojmë repozitorin git dhe të bëjmë commit:

git init
git add
git commit -m "Commit-i i parë i API"

3. Krijoni një aplikacion të ri në Heroku.

heroku create

Dërgojmë master branch në repozitorin e largët të Heroku:

git push heroku master

Tani mund të filloni duke hapur shërbimin API përmes komandave:

heroku ps:scale web=1
heroku open
 

API do të jetë i disponueshëm në adresën your-random-heroku-name.herokuapp.com/ai-quotes.

Si ta shtoni API-në tuaj në tregun RapidAPI

Pas publikimit të shërbimit API në Heroku, mund ta shtoni atë në Rapid API. Këtu është dokumentacioni i hollësishëm në lidhje me këtë temë.

1. Krijoni një llogari RapidAPI.

Po shkruajmë API në Python (me Flask dhe RapidAPI)

Regjistroni njĂ« llogari falas — mund ta bĂ«ni kĂ«tĂ« pĂ«rmes Facebook, Google, GitHub.

Po shkruajmë API në Python (me Flask dhe RapidAPI)

2. Shtoni API-në në panelin e kontrollit.

Po shkruajmë API në Python (me Flask dhe RapidAPI)

3. Më vonë, së pari futni informacionin e përgjithshëm për API-në tuaj.

Po shkruajmë API në Python (me Flask dhe RapidAPI)

4. Pas klikimit nĂ« “Shto API”, shfaqet njĂ« faqe e re ku mund tĂ« vendosni informacionin pĂ«r API-nĂ« tonĂ«.

Po shkruajmë API në Python (me Flask dhe RapidAPI)

5. Tani mund të futni me dorë endpoint-et e API-it ose të ngarkoni skedarin swagger me anë të OpenAPI.

Po shkruajmë API në Python (me Flask dhe RapidAPI)

Tani duhet të vendosim endpoint-et e API-së tonë në faqen e Endpoint-eve. Në rastin tonë, endpoint-et përputhen me konceptin CRUD (get, post, put, delete).

Po shkruajmë API në Python (me Flask dhe RapidAPI)

Më pas duhet të krijojmë një endpoint GET AI Quote, i cili kthen një citat të rastësishëm (nëse ID është default) ose një citat për ID-në e caktuar.

PĂ«r tĂ« krijuar njĂ« endpoint, duhet tĂ« klikoni butonin “Krijo Endpoint”.

Po shkruajmë API në Python (me Flask dhe RapidAPI)

Përsëritni këtë proces për të gjitha endpoint-et e tjera të API-së. Këtu është gjithçka! Urime, keni publikuar API-në tuaj!

Nëse gjithçka është në rregull, faqja e API-së do të duket kështu:

Po shkruajmë API në Python (me Flask dhe RapidAPI)

Përfundim

Në këtë artikull, ne shqyrtuam procesin e krijimit të një shërbimi RESTful API në Python, së bashku me procesin e publikimit të API-së në cloud-in Heroku dhe shtimin e tij në katalogun RapidAPI.

Por nĂ« versionin e provĂ«s u treguan vetĂ«m parimet bazĂ« tĂ« zhvillimit tĂ« API-sĂ« — aspekte si siguria, qĂ«ndrueshmĂ«ria dhe shkallĂ«zimi nuk u shqyrtuan.

Kur zhvilloni një API të vërtetë, gjithçka duhet të merret parasysh.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster