Եթե կարդում եք այս հոդվածը, հավանաբար արդեն ծանոթ եք այն հնարավորություններին, որոնք բացվում են API-ն (Application Programming Interface) օգտագործելիս:
Ձեր հավելվածին ավելացնելով բազմաթիվ հանրային API-ներից մեկը՝ կարող եք ընդլայնել այս հավելվածի ֆունկցիոնալությունը կամ լրացնել այն անհրաժեշտ տվյալներով։ Բայց ի՞նչ անել, եթե դուք մշակել եք յուրահատուկ հատկանիշ, որը ցանկանում եք կիսվել համայնքի հետ:
Պատասխանը պարզ է՝ ձեզ հարկավոր է ստեղծել ձեր սեփական API-ն.
Թեև սկզբում սա կարող է դժվարին աշխատանք թվալ, այն իրականում բավականին պարզ է: Մենք ձեզ ցույց կտանք, թե ինչպես դա անել Python-ի հետ:
Այն, ինչ ձեզ հարկավոր է սկսելու համար
API-ի մշակումը պահանջում է.
Python3;
տափաշիշ — վեբ հավելվածներ ստեղծելու պարզ և հեշտ օգտագործման շրջանակ;
Flask-Հանգիստ Flask-ի ընդլայնում է, որը թույլ է տալիս արագ և նվազագույն կոնֆիգուրացիայով զարգացնել REST API:
Տեղադրումն իրականացվում է հրամանով.
pip install flask-restful
Մենք առաջարկում ենք անվճար ինտենսիվ ծրագրավորում սկսնակների համար. Telegram բոտի մշակում C#-ում — օգոստոսի 26–28։ Անվճար ինտենսիվ, որը թույլ է տալիս հասկանալ, թե ինչպես են աշխատում օգնական բոտերը, Telegram API-ի հետ աշխատելու առանձնահատկությունները և այլ նրբերանգներ: Լավագույն երեք մասնակիցները Skillbox-ից կստանան 30 ռուբլի.
Առաջադրանքը լիովին հասկանալու համար եկեք հասկանանք վերը նշված երկու տերմինները։
Ի՞նչ է ՀԱՆԳՍՏՈՒՄԸ:
REST API-ն (Representational State Transfer) API է, որն օգտագործում է HTTP հարցումները տվյալների փոխանակման համար:
REST API-ները պետք է համապատասխանեն որոշակի չափանիշների՝
Հաճախորդ-սերվեր ճարտարապետություն. հաճախորդը փոխազդում է օգտատիրոջ միջերեսի հետ, իսկ սերվերը փոխազդում է հետնամասի և տվյալների պահեստի հետ: Հաճախորդը և սերվերը անկախ են, դրանցից որևէ մեկը կարող է փոխարինվել մյուսից առանձին:
Քաղաքացիություն չունեցող – Սերվերում հաճախորդի տվյալներ չեն պահվում: Սեսիայի վիճակը պահվում է հաճախորդի կողմից:
Cacheability - Հաճախորդները կարող են քեշավորել սերվերի պատասխանները՝ բարելավելու ընդհանուր կատարումը:
Ի՞նչ է CRUD-ը:
ՔԱԱՔ ծրագրավորման հայեցակարգ է, որը նկարագրում է չորս հիմնական գործողություններ (ստեղծել, կարդալ, թարմացնել և ջնջել):
REST API-ում հարցումների տեսակները և հարցումների մեթոդները պատասխանատու են այնպիսի գործողությունների համար, ինչպիսիք են՝ փակցնել, ստանալ, դնել, ջնջել:
Այժմ, երբ մենք գործ ունենք հիմնական պայմանների հետ, կարող ենք սկսել API-ի ստեղծումը:
Զարգացում
Եկեք ստեղծենք արհեստական ինտելեկտի մասին մեջբերումների պահոց: AI-ն այսօր ամենաարագ զարգացող տեխնոլոգիաներից մեկն է, և Python-ը AI-ի հետ աշխատելու հայտնի գործիք է:
Այս API-ի միջոցով Python ծրագրավորողը կարող է արագ սովորել AI-ի մասին և ոգեշնչվել նոր ձեռքբերումներով: Եթե մշակողը արժեքավոր մտքեր ունի այս թեմայի վերաբերյալ, նա կկարողանա դրանք ավելացնել պահեստում:
Սկսենք ներմուծելով պահանջվող մոդուլները և կարգավորելով Flask:
from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)
Այս հատվածում Flask-ը, Api-ն և Resource-ը մեզ անհրաժեշտ դասերն են:
Reqparse-ը Flask-RESTful հարցումների վերլուծման ինտերֆեյս է... Ձեզ անհրաժեշտ կլինի նաև պատահական մոդուլ՝ պատահական մեջբերում ցուցադրելու համար:
Այժմ մենք կստեղծենք AI-ի մասին մեջբերումների պահոց:
Յուրաքանչյուր ռեպո գրառում կպարունակի.
թվային ID;
Մեջբերման հեղինակի անունը;
մեջբերում.
Քանի որ սա պարզապես ուսումնական օրինակ է, մենք բոլոր գրառումները կպահենք Python ցուցակում: Իրական հավելվածում մենք, ամենայն հավանականությամբ, փոխարենը կօգտագործեինք տվյալների բազա:
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."
}
]
Այժմ մենք պետք է ստեղծենք Quote ռեսուրսների դաս, որը կսահմանի մեր API-ի վերջնակետերի գործողությունները: Դասի ներսում պետք է հայտարարված լինի չորս մեթոդ՝ ստանալ, տեղադրել, տեղադրել, ջնջել:
Սկսենք GET մեթոդից
Այն թույլ է տալիս ստանալ կոնկրետ գնանշում` նշելով դրա ID-ն, կամ պատահական մեջբերում, եթե ID-ն նշված չէ:
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
GET մեթոդը վերադարձնում է պատահական մեջբերում, եթե ID-ն պարունակում է լռելյայն արժեքը, այսինքն. երբ զանգում է մեթոդի ID-ն սահմանված չէր:
Եթե դրված է, ապա մեթոդը որոնում է չակերտների մեջ և գտնում է այն, որը պարունակում է տվյալ ID-ն։ Եթե ոչինչ չի գտնվել, ցուցադրվում է «Մեջբերումը չի գտնվել, 404» հաղորդագրությունը:
Հիշեք, որ մեթոդը վերադարձնում է HTTP 200 կարգավիճակ, եթե հարցումը հաջողված է, և 404, եթե մուտքագրումը չի գտնվել:
Հիմա եկեք ստեղծենք POST մեթոդ՝ պահեստում նոր մեջբերում ավելացնելու համար
Այն կստանա յուրաքանչյուր նոր մեջբերումի նույնականացումը, երբ դուք մուտքագրեք: Բացի այդ, POST-ը կօգտագործի reqparse՝ վերլուծելու այն պարամետրերը, որոնք կգնան հարցումի մարմնում (հեղինակ և մեջբերում տեքստ):
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
Վերևի կոդում POST մեթոդն ընդունում էր գնանշման ID: Այնուհետև, օգտագործելով reqparse, այն վերցրեց հեղինակին և մեջբերումը հարցումից՝ դրանք պահելով params բառարանում:
Եթե նշված ID-ով մեջբերում արդեն կա, ապա մեթոդը ցուցադրում է համապատասխան հաղորդագրությունը և կոդը 400:
Եթե նշված ID-ով մեջբերում դեռ չի ստեղծվել, մեթոդը ստեղծում է նոր մուտք՝ նշված ID-ով և հեղինակով, ինչպես նաև այլ պարամետրերով: Այնուհետև նա ավելացնում է մուտքագրում ai_quotes ցուցակում և վերադարձնում մուտքը նոր մեջբերումով 201 կոդով:
Այժմ մենք ստեղծում ենք PUT մեթոդ՝ պահեստում գոյություն ունեցող մեջբերումը փոխելու համար
PUT մեթոդը, նախորդ օրինակի նման, վերցնում է ID և մուտքագրում և վերլուծում է չակերտի պարամետրերը՝ օգտագործելով reqparse:
Եթե առկա է նշված ID-ով մեջբերում, մեթոդը կթարմացնի այն նոր պարամետրերով, այնուհետև դուրս կբերի թարմացված մեջբերումը 200 կոդով: Եթե նշված ID-ով դեռ մեջբերում չկա, կստեղծվի 201 կոդով նոր գրառում:
Վերջապես, եկեք ստեղծենք DELETE մեթոդ՝ հեռացնելու այն մեջբերումը, որն այլևս ոգեշնչող չէ:
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
Այս մեթոդը ընդունում է մեջբերումի ID-ն որպես մուտքագրում և թարմացնում է ai_quotes ցուցակը՝ օգտագործելով ընդհանուր ցուցակը:
Այժմ, երբ մենք ստեղծել ենք բոլոր մեթոդները, մեզ միայն անհրաժեշտ է պարզապես ռեսուրսը ավելացնել API-ին, սահմանել ուղին և գործարկել Flask-ը:
api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
app.run(debug=True)
Մեր REST API ծառայությունը պատրաստ է:
Այնուհետև մենք կարող ենք պահպանել կոդը app.py ֆայլում՝ այն գործարկելով վահանակում՝ հրամանով.
python3 app.py
Եթե ամեն ինչ լավ է, ապա մենք կստանանք այսպիսի բան.
* Վրիպազերծման ռեժիմ՝ միացված
* Վազում է 127.0.0.1:5000/ (Սեղմեք CTRL+C՝ դուրս գալու համար)
* Վերագործարկվում է stat-ով
* Վրիպազերծիչը ակտիվ է:
* Վրիպազերծիչ PIN՝ XXXXXXX
API-ի փորձարկում
API-ի ստեղծումից հետո այն պետք է փորձարկվի:
Դա կարելի է անել՝ օգտագործելով curl console utility-ը կամ Insomnia REST հաճախորդը, կամ API-ը Rapid API-ում հրապարակելով:
Հրապարակում ենք մեր API-ն
RapidAPI-ն աշխարհի ամենամեծ շուկան է, որն ունի ավելի քան 10 API (և մոտ 000 միլիոն մշակող):
RapidAPI-ն ոչ միայն ապահովում է մեկ ինտերֆեյս երրորդ կողմի API-ների հետ աշխատելու համար, այլ նաև թույլ է տալիս արագ և հեշտությամբ հրապարակել ձեր սեփական API-ն:
Procfile, որը նշում է, թե որ հրամանները պետք է կատարվեն հավելվածը գործարկելու համար.
.gitignore - բացառել ֆայլերը, որոնք անհրաժեշտ չեն սերվերում:
Required.txt ֆայլը կպարունակի հետևյալ տողերը.
շիշ
կոլբա-հանգիստ
հրացան
Խնդրում ենք նկատի ունենալ, որ մենք ավելացրել ենք Gunicorn (Python WSGI HTTP Server) ցուցակին, քանի որ մենք պետք է գործարկենք մեր հավելվածը սերվերի վրա:
Պրոֆայլը կպարունակի.
վեբ: Gunicorn հավելված:հավելված
.gitignore-ի բովանդակությունը.
*.pyc
__pycache__/
Այժմ, երբ ֆայլերը ստեղծվել են, եկեք նախաստորագրենք git repo-ն և կատարենք.
git init
git add
git commit -m "First API commit"
3. Ստեղծեք նոր Heroku հավելված:
heroku create
Հրելով հիմնական ճյուղը հեռավոր Heroku ռեպո.
git push heroku master
Այժմ կարող եք սկսել՝ բացելով API ծառայությունը հրամաններով.
Ինչպես ավելացնել ձեր Python API-ն RapidAPI շուկայում
Երբ API ծառայությունը հրապարակվի Heroku-ում, դուք կարող եք այն ավելացնել Rapid API-ին: Այստեղ մանրամասն փաստաթղթեր այս թեմայի շուրջ:
1. Ստեղծեք RapidAPI հաշիվ:
Մենք գրանցում ենք անվճար հաշիվ. դա կարելի է անել Facebook-ի, Google-ի, GitHub-ի միջոցով:
2. Ավելացրեք API կառավարման վահանակին:
3. Հաջորդը, մուտքագրեք ընդհանուր տեղեկություններ ձեր API-ի մասին:
4. «Ավելացնել API» սեղմելուց հետո հայտնվում է նոր էջ, որտեղ կարող եք մուտքագրել մեր API-ի մասին տեղեկությունները:
5. Այժմ դուք կարող եք կամ ձեռքով մուտքագրել API-ի վերջնակետերը, կամ ներբեռնել swagger ֆայլ օգտագործելով OpenAPI:
Դե, հիմա դուք պետք է սահմանեք մեր API-ի վերջնակետերը Endpoints էջում: Մեր դեպքում վերջնակետերը համապատասխանում են CRUD հասկացությանը (ստանալ, տեղադրել, տեղադրել, ջնջել):
Հաջորդը, դուք պետք է ստեղծեք GET AI Quote վերջնակետ, որը ցուցադրում է պատահական մեջբերում (եթե ID-ն լռելյայն է) կամ մեջբերում նշված ID-ի համար:
Վերջնական կետ ստեղծելու համար հարկավոր է սեղմել «Ստեղծել վերջնակետ» կոճակը:
Մենք կրկնում ենք այս գործընթացը բոլոր մյուս API վերջնակետերի համար: Այսքանը: Շնորհավորում ենք, դուք հրապարակել եք ձեր API-ն:
Եթե ամեն ինչ լավ ընթանա, API էջը կունենա այսպիսի տեսք.
Ամփոփում
Այս հոդվածում մենք քայլեցինք Python-ում մեր RESTful API ծառայության ստեղծման գործընթացով, ինչպես նաև API-ը Heroku ամպում հրապարակելու և RapidAPI գրացուցակում ավելացնելու գործընթացով:
Բայց թեստային տարբերակում ցուցադրվեցին միայն API-ի մշակման հիմնական սկզբունքները. այնպիսի նրբերանգներ, ինչպիսիք են անվտանգությունը, սխալների հանդուրժողականությունը և մասշտաբայնությունը, հաշվի չեն առնվել: