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.
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
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.
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.
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.
Regjistroni një llogari falas - kjo mund të bëhet duke përdorur Facebook, Google, GitHub.
2. Shtoni API-në në panelin e kontrollit.
3. Më pas, futni informacione të përgjithshme për API-në tuaj.
4. Pasi të klikoni “Shto API” shfaqet një faqe e re ku mund të futni informacione për API-në tonë.
5. Tani mund të futni manualisht pikat fundore të API ose të shkarkoni swagger-file duke përdorur OpenAPI.
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).
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".
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:
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.