Shkrimi i një API në Python (me Flask dhe RapidAPI)

Shkrimi i një API në Python (me Flask dhe RapidAPI)

Nëse po lexoni këtë artikull, me siguri tashmë jeni njohur me mundësitë që vijnë me përdorimin e një API (Application Programming Interface).

Duke shtuar një nga shumë API-të e hapura në aplikacionin tuaj, mund të zgjeroni funksionalitetin e aplikacionit ose ta pasuroni atë me të dhënat e nevojshme. Por, çka nëse keni krijuar një veçori unike që dëshironi ta ndani me komunitetin?

Përgjigja është e thjeshtë: keni nevojë krijoni API-në tuaj.

Edhe pse kjo mund të duket si një detyrë e vështirë në fillim, në fakt është e thjeshtë. Ne do t'ju tregojmë se si ta bëni këtë duke përdorur Python.

Çfarë ju duhet për të filluar

Për të zhvilluar një API ju duhet:

  • Python 3;
  • Balonë — një kornizë e thjeshtë dhe e lehtë për t'u përdorur për krijimin e aplikacioneve në internet;
  • Flask-Plotësues është një shtesë për Flask që ju lejon të zhvilloni një API REST shpejt dhe me konfigurim minimal.

Instalimi kryhet me komandën:

pip install flask-restful

Ne rekomandojmë një kurs programimi intensiv falas për fillestarët:
Zhvillimi i robotëve të telegramit në C# - 26-28 gusht. Një kurs intensiv falas që ju lejon të kuptoni se si funksionojnë robotët e ndihmës, specifikat e punës me API të Telegram dhe nuanca të tjera. Tre pjesëmarrësit më të mirë do të marrin 30 rubla nga Skillbox.

Para se të filloni

Ne do të zhvillojmë një API RESTful me bazë Funksionaliteti CRUID.

Për të kuptuar plotësisht detyrën, le të kuptojmë dy termat e përmendur më sipër.

Çfarë është REST?

REST API (Representational State Transfer) është një API që përdor kërkesat HTTP për të shkëmbyer të dhëna.

API-të REST duhet të plotësojnë disa kritere:

  • Arkitektura klient-server: Klienti ndërvepron me ndërfaqen e përdoruesit dhe serveri ndërvepron me backend-in dhe ruajtjen e të dhënave. Klienti dhe serveri janë të pavarur, secili prej tyre mund të zëvendësohet veçmas nga tjetri.
  • Pa shtetësi - nuk ruhen të dhëna klienti në server. Gjendja e sesionit ruhet në anën e klientit.
  • Memoria e fshehtë - Klientët mund të ruajnë përgjigjet e serverit për të përmirësuar performancën e përgjithshme.

Çfarë është CRUD?

I MADH është një koncept programimi që përshkruan katër veprime themelore (krijoni, lexoni, përditësoni dhe fshini).

Në REST API, llojet e kërkesave dhe metodat e kërkesave janë përgjegjëse për veprime të tilla si postimi, marrja, vendosja, fshirja.

Tani që i kuptojmë termat bazë, mund të fillojmë të krijojmë API.

Разработка

Le të krijojmë një depo citatesh rreth inteligjencës artificiale. AI është një nga teknologjitë me rritje më të shpejtë sot, dhe Python është një mjet popullor për të punuar me AI.

Me këtë API, një zhvillues Python mund të marrë shpejt informacion rreth AI dhe të frymëzohet nga përparimet e reja. Nëse një zhvillues ka mendime të vlefshme për këtë temë, ai do të jetë në gjendje t'i shtojë ato në depo.

Le të fillojmë duke importuar modulet e nevojshme dhe duke vendosur Flask:

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

Në këtë fragment, Flask, Api dhe Resource janë klasat që na duhen.

Reqparse është një ndërfaqe e analizimit të pyetjeve në Flask-RESTful... Do t'ju duhet gjithashtu një modul i rastësishëm për të shfaqur një kuotë të rastësishme.

Tani do të krijojmë një depo citatesh rreth AI.

Çdo hyrje në repo do të përmbajë:

  • ID dixhitale;
  • emri i autorit të citatit;
  • kuotë.

Meqenëse ky është vetëm një shembull trajnimi, ne do t'i ruajmë të gjitha hyrjet në një listë Python. Në një aplikacion të vërtetë, ne ka të ngjarë të përdorim një bazë të dhënash në vend.

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

Tani ne duhet të krijojmë një klasë burimi Quote që do të përcaktojë operacionet e pikave tona të fundit të API. Brenda klasës ju duhet të deklaroni katër metoda: merrni, postoni, vendosni, fshini.

Le të fillojmë me metodën GET

Ai bën të mundur marrjen e një kuote specifike duke specifikuar ID-në e saj, ose një kuotë të rastësishme nëse ID-ja 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 "Quote not found", 404

Metoda GET kthen një kuotë të rastësishme nëse ID-ja përmban vlerën e paracaktuar, d.m.th. nuk u specifikua asnjë ID gjatë thirrjes së metodës.

Nëse specifikohet, atëherë metoda kërkon midis citimeve dhe gjen atë që përmban ID-në e specifikuar. Nëse nuk gjendet asgjë, shfaqet mesazhi "Citata nuk u gjet, 404".

Mbani mend: metoda kthen një status HTTP prej 200 nëse kërkesa ishte e suksesshme dhe 404 nëse rekordi nuk u gjet.

Tani le të krijojmë një metodë POST për të shtuar një kuotë të re në depo

Ajo do të marrë ID-në e çdo kuotimi të ri ndërsa shkruani. Përveç kësaj, POST do të përdorë reqparse për të analizuar parametrat që do të hyjnë në trupin e kërkesës (autori dhe teksti i citimit).

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

Në kodin e mësipërm, metoda POST pranoi ID-në e kuotës. Më pas, duke përdorur reqparse, ai mori autorin dhe citimin nga pyetja, duke i ruajtur ato në fjalorin e parametrave.

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

Nëse një citim me ID-në e specifikuar nuk është krijuar ende, metoda krijon një rekord të ri me ID-në dhe autorin e specifikuar, si dhe parametra të tjerë. Më pas shton hyrjen në listën ai_quotes dhe e kthen hyrjen me kuotën e re së bashku me një kod 201.

Tani krijojmë një metodë PUT për të ndryshuar një kuotë ekzistuese 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, e ngjashme me shembullin e mëparshëm, merr ID dhe input dhe analizon parametrat e kuotës duke përdorur reqparse.

Nëse ekziston një citim me ID-në e specifikuar, metoda do ta përditësojë atë me parametrat e rinj dhe më pas do të nxjerrë citimin e përditësuar me kodin 200. Nëse nuk ka ende citim me ID-në e specifikuar, do të krijohet një rekord i ri me kodin 201.

Së fundi, le të krijojmë një metodë DELETE për të hequr një citat që nuk është më frymëzues

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

Kjo metodë merr ID-në e kuotave si hyrje dhe përditëson listën ai_quotes duke përdorur listën e përbashkët.

Tani që kemi krijuar të gjitha metodat, gjithçka që duhet të bëjmë është thjesht të shtojmë një burim në API, të vendosim shtegun dhe të ekzekutojmë 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, ne mund ta ruajmë kodin në skedarin app.py duke e ekzekutuar atë në tastierë duke përdorur komandën:

python3 app.py

Nëse gjithçka është mirë, atëherë do të marrim diçka të tillë:

* Modaliteti i korrigjimit: aktiv
*Vrapimi në 127.0.0.1:5000/ (Shtypni CTRL+C për të dalë)
* Rifillimi me stat
* Korrigjuesi është aktiv!
* PIN korrigjues: XXXXXXX

Testimi i API-së

Pasi të krijohet API, duhet të testohet.

Kjo mund të bëhet duke përdorur programin e konsolës curl ose klientin Insomnia REST, ose duke publikuar API-në në Rapid API.

Shkrimi i një API në Python (me Flask dhe RapidAPI)

Publikimi i API-së sonë

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

RapidAPI jo vetëm që ofron një ndërfaqe të vetme për të punuar me API-të e palëve të treta, por gjithashtu ju jep mundësinë për të publikuar shpejt dhe me lehtësi API-në tuaj.

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

Si të publikoni API-në tuaj në Heroku

1. Instaloni Heroku.

Hapi i parë është regjistrimi dhe instalimi i ndërfaqes së linjës së komandës Heroku (CLI). Kjo funksionon në Ubuntu 16+.

sudo snap install heroku —klasik

Pastaj identifikohu:

heroku login

2. Shtoni skedarët e nevojshëm.

Tani duhet të shtojmë skedarët që do të publikohen në një dosje në aplikacionin tonë:

  • kërkesat.txt me një listë të moduleve të kërkuara Python;
  • Profile, e cila specifikon se cilat komanda duhet të ekzekutohen për të ekzekutuar aplikacionin;
  • .gitignore - për të përjashtuar skedarët që nuk nevojiten në server.

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

  • balonë
  • flask-prehës
  • gunicorn

Ju lutemi vini re se ne kemi shtuar gunicorn (Serveri Python WSGI HTTP) në listë sepse duhet të ekzekutojmë aplikacionin tonë në server.

Profili do të përmbajë:

ueb: aplikacioni guncorn: aplikacioni

Përmbajtja e .gitignore:

*.pyc
__pycache__/

Tani që skedarët janë krijuar, le të inicializojmë repon e git dhe të angazhohemi:

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

3. Krijoni një aplikacion të ri Heroku.

heroku create

Ne e shtyjmë degën kryesore në repon e largët Heroku:

git push heroku master

Tani mund të filloni duke hapur Shërbimin API duke përdorur komandat:

heroku ps:scale web=1
heroku open
 

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

Si të shtoni API-në tuaj të Python në tregun RapidAPI

Pasi shërbimi juaj API të publikohet në Heroku, mund ta shtoni atë në API të shpejtë. Këtu dokumentacion i detajuar në këtë temë.

1. Krijo një llogari RapidAPI.

Shkrimi i një API në Python (me Flask dhe RapidAPI)

Regjistroni një llogari falas - kjo mund të bëhet duke përdorur Facebook, Google, GitHub.

Shkrimi i një API në Python (me Flask dhe RapidAPI)

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

Shkrimi i një API në Python (me Flask dhe RapidAPI)

3. Më pas, futni informacione të përgjithshme për API-në tuaj.

Shkrimi i një API në Python (me Flask dhe RapidAPI)

4. Pasi të klikoni “Shto API” shfaqet një faqe e re ku mund të futni informacione për API-në tonë.

Shkrimi i një API në Python (me Flask dhe RapidAPI)

5. Tani mund të futni manualisht pikat fundore të API ose të shkarkoni swagger-file duke përdorur OpenAPI.

Shkrimi i një API në Python (me Flask dhe RapidAPI)

Epo, tani duhet të vendosim pikat fundore të API-së tonë në faqen Endpoints. Në rastin tonë, pikat fundore korrespondojnë me konceptin e CRUD (merr, posto, vendos, fshi).

Shkrimi i një API në Python (me Flask dhe RapidAPI)

Më pas, duhet të krijoni një pikë përfundimtare të GET AI Quote që shfaq një kuotë të rastësishme (nëse ID është e paracaktuar) ose një kuotë për ID-në e specifikuar.

Për të krijuar një pikë fundore, klikoni butonin "Krijo pikën përfundimtare".

Shkrimi i një API në Python (me Flask dhe RapidAPI)

Ne e përsërisim këtë proces për të gjitha pikat e tjera fundore të API. Kjo eshte e gjitha! Urime, ju keni publikuar API-në tuaj!

Nëse gjithçka është mirë, faqja API do të duket diçka si kjo:

Shkrimi i një API në Python (me Flask dhe RapidAPI)

Përfundim

Në këtë artikull, ne mësuam procesin e krijimit të Shërbimit tuaj RESTful API në Python, së bashku me procesin e publikimit të API-së në renë Heroku dhe shtimit të tij në drejtorinë RapidAPI.

Por versioni i testit tregoi vetëm parimet themelore të zhvillimit të API - nuancat si siguria, toleranca e gabimeve dhe shkallëzueshmëria nuk u morën parasysh.

Kur zhvilloni një API të vërtetë, e gjithë kjo duhet të merret parasysh.

Burimi: www.habr.com

Shto një koment