Pagsusulat ng API sa Python (na may Flask at RapidAPI)
Kung binabasa mo ang artikulong ito, malamang na pamilyar ka na sa mga posibilidad na kasama ng paggamit ng API (Application Programming Interface).
Sa pamamagitan ng pagdaragdag ng isa sa maraming bukas na API sa iyong application, maaari mong palawigin ang functionality ng application o pagyamanin ito ng kinakailangang data. Ngunit paano kung bumuo ka ng isang natatanging tampok na gusto mong ibahagi sa komunidad?
Ang sagot ay simple: kailangan mo lumikha ng iyong sariling API.
Kahit na ito ay maaaring mukhang isang mahirap na gawain sa simula, ito ay talagang simple. Ipapakita namin sa iyo kung paano ito gawin gamit ang Python.
Ano ang kailangan mo para makapagsimula
Upang bumuo ng isang API kailangan mo:
Python3;
Prasko β isang simple at madaling gamitin na balangkas para sa paglikha ng mga web application;
Prasko-NAGPAHINGAT ay isang extension para sa Flask na nagbibigay-daan sa iyong bumuo ng REST API nang mabilis at may kaunting configuration.
Ang pag-install ay isinasagawa gamit ang utos:
pip install flask-restful
Inirerekomenda namin ang isang libreng intensive programming course para sa mga nagsisimula: Pag-unlad ng Telegram bot sa C# β Agosto 26β28. Isang libreng masinsinang kurso na nagbibigay-daan sa iyong maunawaan kung paano gumagana ang mga assistant bot, ang mga detalye ng pagtatrabaho sa Telegram API at iba pang mga nuances. Ang tatlong pinakamahusay na kalahok ay makakatanggap ng 30 rubles mula sa Skillbox.
Upang lubos na maunawaan ang gawain, unawain natin ang dalawang terminong nabanggit sa itaas.
Ano ang REST?
Ang REST API (Representational State Transfer) ay isang API na gumagamit ng mga kahilingan sa HTTP upang makipagpalitan ng data.
Dapat matugunan ng mga REST API ang ilang partikular na pamantayan:
Arkitektura ng Client-server: Nakikipag-ugnayan ang kliyente sa interface ng gumagamit, at nakikipag-ugnayan ang server sa backend at imbakan ng data. Ang kliyente at server ay independiyente, alinman sa mga ito ay maaaring palitan nang hiwalay sa isa pa.
Stateless - walang data ng kliyente na nakaimbak sa server. Ang katayuan ng session ay naka-imbak sa panig ng kliyente.
Cacheability - Maaaring i-cache ng mga kliyente ang mga tugon ng server upang mapabuti ang pangkalahatang pagganap.
Ano ang CRUD?
RAW ay isang konsepto ng programming na naglalarawan ng apat na pangunahing aksyon (lumikha, magbasa, mag-update at magtanggal).
Sa REST API, ang mga uri ng kahilingan at mga paraan ng kahilingan ay responsable para sa mga aksyon tulad ng pag-post, pagkuha, ilagay, tanggalin.
Ngayong nauunawaan na natin ang mga pangunahing termino, maaari na nating simulan ang paggawa ng API.
Development
Gumawa tayo ng repository ng mga quotes tungkol sa artificial intelligence. Ang AI ay isa sa pinakamabilis na lumalagong teknolohiya ngayon, at ang Python ay isang sikat na tool para sa pagtatrabaho sa AI.
Gamit ang API na ito, ang isang developer ng Python ay maaaring mabilis na makakuha ng impormasyon tungkol sa AI at makakuha ng inspirasyon ng mga bagong pag-unlad. Kung ang isang developer ay may mahalagang mga saloobin sa paksang ito, magagawa niyang idagdag ang mga ito sa repositoryo.
Magsimula tayo sa pamamagitan ng pag-import ng mga kinakailangang module at pag-set up ng Flask:
from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)
Sa snippet na ito, Flask, Api at Resource ang mga klase na kailangan namin.
Ang Reqparse ay isang Flask-RESTful query parsing interface... Kakailanganin mo rin ang isang random na module upang magpakita ng isang random na quote.
Ngayon ay gagawa kami ng repositoryo ng mga quote tungkol sa AI.
Ang bawat repo entry ay naglalaman ng:
digital ID;
pangalan ng may-akda ng sipi;
quote.
Dahil ito ay halimbawa lamang ng pagsasanay, iimbak namin ang lahat ng mga entry sa isang listahan ng Python. Sa isang tunay na aplikasyon, malamang na gumamit kami ng database sa halip.
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."
}
]
Ngayon ay kailangan naming lumikha ng isang Quote resource class na tutukuyin ang mga pagpapatakbo ng aming mga API endpoint. Sa loob ng klase kailangan mong magdeklara ng apat na paraan: kumuha, mag-post, maglagay, magtanggal.
Magsimula tayo sa pamamaraang GET
Ginagawa nitong posible na makakuha ng isang partikular na quote sa pamamagitan ng pagtukoy sa ID nito, o isang random na quote kung ang ID ay hindi tinukoy.
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
Ang GET method ay nagbabalik ng random na quote kung ang ID ay naglalaman ng default na value, i.e. walang tinukoy na ID kapag tumatawag sa pamamaraan.
Kung ito ay tinukoy, ang pamamaraan ay naghahanap sa pagitan ng mga pagsipi at hinahanap ang isa na naglalaman ng tinukoy na ID. Kung walang mahanap, ang mensaheng "Quote not found, 404" ay ipapakita.
Tandaan: ang paraan ay nagbabalik ng HTTP status na 200 kung ang kahilingan ay matagumpay at 404 kung ang rekord ay hindi natagpuan.
Ngayon, gumawa tayo ng POST method para magdagdag ng bagong quote sa repository
Makukuha nito ang ID ng bawat bagong quote habang nagta-type ka. Bilang karagdagan, gagamit ang POST ng reqparse para i-parse ang mga parameter na mapupunta sa katawan ng kahilingan (may-akda at teksto ng quote).
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
Sa code sa itaas, tinanggap ng POST method ang quote ID. Pagkatapos, gamit ang reqparse, nakuha nito ang may-akda at sipi mula sa query, na iniimbak ang mga ito sa diksyunaryo ng params.
Kung mayroon nang quote na may tinukoy na ID, ang pamamaraan ay nagpapakita ng kaukulang mensahe at code 400.
Kung ang isang pagsipi na may tinukoy na ID ay hindi pa nagagawa, ang pamamaraan ay gagawa ng isang bagong tala na may tinukoy na ID at may-akda, pati na rin ang iba pang mga parameter. Pagkatapos ay idinaragdag nito ang entry sa listahan ng ai_quotes at ibinabalik ang entry na may bagong quote kasama ang isang 201 code.
Ngayon ay lumikha kami ng isang paraan ng PUT upang baguhin ang isang umiiral na quote sa repositoryo
Ang paraan ng PUT, katulad ng naunang halimbawa, ay kumukuha ng ID at input at na-parse ang mga parameter ng quote gamit ang reqparse.
Kung mayroong isang pagsipi na may tinukoy na ID, ia-update ito ng pamamaraan kasama ang mga bagong parameter at pagkatapos ay ilalabas ang na-update na pagsipi na may code 200. Kung wala pang pagsipi na may tinukoy na ID, isang bagong tala na may code 201 ang gagawin.
Sa wakas, gumawa tayo ng paraan ng DELETE para maalis ang isang quote na hindi na nagbibigay inspirasyon
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
Nakukuha ng paraang ito ang quote ID bilang input at ina-update ang listahan ng ai_quotes gamit ang nakabahaging listahan.
Ngayong nagawa na namin ang lahat ng pamamaraan, ang kailangan lang naming gawin ay magdagdag lamang ng mapagkukunan sa API, itakda ang landas, at patakbuhin ang Flask.
api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
app.run(debug=True)
Ang aming REST API Service ay handa na!
Susunod, maaari naming i-save ang code sa app.py file sa pamamagitan ng pagpapatakbo nito sa console gamit ang command:
python3 app.py
Kung ang lahat ay mabuti, makakakuha tayo ng ganito:
* Debug mode: naka-on
* Tumatakbo sa 127.0.0.1:5000/ (Pindutin ang CTRL+C para huminto)
* Nagsisimula sa stat
* Aktibo ang debugger!
* Debugger PIN: XXXXXXX
Pagsubok sa API
Kapag nalikha na ang API, kailangan itong masuri.
Magagawa ito gamit ang curl console utility o ang Insomnia REST client, o sa pamamagitan ng pag-publish ng API sa Rapid API.
Pag-publish ng aming API
Ang RapidAPI ay ang pinakamalaking marketplace sa mundo na may higit sa 10 API (at humigit-kumulang 000 milyong developer).
Ang RapidAPI ay hindi lamang nagbibigay ng isang interface para sa pagtatrabaho sa mga third-party na API, ngunit nagbibigay din sa iyo ng kakayahang mabilis at madaling i-publish ang iyong sariling API.
Paano idagdag ang iyong Python API sa RapidAPI marketplace
Kapag na-publish na ang iyong serbisyo ng API sa Heroku, maaari mo itong idagdag sa Rapid API. Dito detalyadong dokumentasyon sa paksang ito.
1. Gumawa ng RapidAPI account.
Magrehistro ng isang libreng account - maaari itong gawin gamit ang Facebook, Google, GitHub.
2. Idagdag ang API sa control panel.
3. Susunod, ilagay ang pangkalahatang impormasyon tungkol sa iyong API.
4. Pagkatapos i-click ang "Magdagdag ng API" isang bagong pahina ang lalabas kung saan maaari kang maglagay ng impormasyon tungkol sa aming API.
5. Ngayon ay maaari mong manu-manong ipasok ang mga endpoint ng API o i-download swagger-file gamit ang OpenAPI.
Kaya, ngayon kailangan nating itakda ang mga endpoint ng ating API sa pahina ng Mga Endpoint. Sa aming kaso, ang mga endpoint ay tumutugma sa konsepto ng CRUD (kumuha, mag-post, maglagay, magtanggal).
Susunod, kailangan mong gumawa ng GET AI Quote endpoint na nagpapakita ng random na quote (kung default ang ID) o isang quote para sa tinukoy na ID.
Upang gumawa ng endpoint, i-click ang button na "Gumawa ng Endpoint".
Inuulit namin ang prosesong ito para sa lahat ng iba pang mga endpoint ng API. Iyon lang! Binabati kita, nai-publish mo ang iyong API!
Kung maayos ang lahat, magiging ganito ang hitsura ng pahina ng API:
Konklusyon
Sa artikulong ito, natutunan namin ang proseso ng paggawa ng sarili mong RESTful API Service sa Python, kasama ang proseso ng pag-publish ng API sa Heroku cloud at pagdaragdag nito sa RapidAPI na direktoryo.
Ngunit ang pagsubok na bersyon ay nagpakita lamang ng mga pangunahing prinsipyo ng pag-unlad ng API - ang mga nuances tulad ng seguridad, fault tolerance at scalability ay hindi isinasaalang-alang.
Kapag bumubuo ng isang tunay na API, ang lahat ng ito ay kailangang isaalang-alang.