Навиштани API дар Python (бо Flask ва RapidAPI)

Навиштани API дар Python (бо Flask ва RapidAPI)

Агар шумо ин мақоларо хонда истода бошед, эҳтимол шумо аллакай бо имкониятҳое, ки ҳангоми истифодаи API (Интерфейси барномасозии барнома) кушода мешаванд, шинос ҳастед.

Бо илова кардани яке аз бисёр API-ҳои ҷамъиятӣ ба замимаи худ, шумо метавонед функсияи ин барномаро васеъ кунед ё онро бо маълумоти зарурӣ пурра кунед. Аммо агар шумо як хусусияти беназиреро таҳия карда бошед, ки мехоҳед бо ҷомеа мубодила кунед?

Ҷавоб оддӣ аст: ба шумо лозим аст API-и худро эҷод кунед.

Гарчанде ки ин дар аввал кори душвор ба назар мерасад, дар асл он хеле содда аст. Мо ба шумо нишон медиҳем, ки чӣ тавр ин корро бо Python анҷом диҳед.

Чӣ ба шумо лозим аст, ки оғоз кунед

Таҳияи API талаб мекунад:

  • Python3;
  • Flask — чаҳорчӯбаи оддӣ ва ба осонӣ истифодашаванда барои эҷоди барномаҳои веб;
  • Колба - ИСТИРОХАТ тамдиди Flask аст, ки ба шумо имкон медиҳад REST API-ро зуд ва бо конфигуратсияи ҳадди ақал таҳия кунед.

Насбкунӣ бо фармони зерин иҷро карда мешавад:

pip install flask-restful

Мо барои шурӯъкунандагон барномаи ройгони пуршиддатро тавсия медиҳем:
Таҳияи боти Telegram дар C# — 26—28 август. Интенсивии ройгон, ки ба шумо имкон медиҳад фаҳмед, ки чӣ тавр кор кардани ботҳои ёрирасон, хусусиятҳои кор бо API Telegram ва дигар нозукиҳо. Се иштирокчии беҳтарин аз Skillbox 30 000 рубл мегиранд.

Пеш аз он ки шумо оғоз кунед

Мо як API RESTful бо асосиро таҳия карданӣ ҳастем Функсияи CRUID.

Барои пурра фаҳмидани вазифа, биёед ду истилоҳи дар боло зикршударо фаҳмем.

REST чист?

REST API (Интиқоли давлатии намояндагӣ) як API аст, ки дархостҳои HTTP-ро барои табодули маълумот истифода мебарад.

API-ҳои REST бояд ба меъёрҳои муайян ҷавобгӯ бошанд:

  • Архитектураи муштарӣ-сервер: муштарӣ бо интерфейси корбар ва сервер бо пуштибонӣ ва анбори додаҳо ҳамкорӣ мекунад. Мизоҷ ва сервер мустақиланд, ҳар кадоми онҳоро аз дигараш алоҳида иваз кардан мумкин аст.
  • Бе шаҳрвандӣ - Дар сервер ягон маълумоти муштарӣ нигоҳ дошта намешавад. Ҳолати сессия дар тарафи муштарӣ нигоҳ дошта мешавад.
  • Кэшпазирӣ - Мизоҷон метавонанд посухҳои серверро кэш кунанд, то кори умумиро беҳтар созанд.

CRUD чист?

RAW консепсияи барномасозӣ мебошад, ки чор амали асосиро (эҷод кардан, хондан, навсозӣ ва нест кардан) тавсиф мекунад.

Дар 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-ро барои илова кардани иқтибоси нав ба анбор эҷод кунем

Ҳангоми навиштани шумо он ID-и ҳар як иқтибоси навро мегирад. Илова бар ин, 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-ро барои тағир додани иқтибоси мавҷуда дар анбор эҷод мекунем

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

Усули 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)

Хидмати API REST мо омода аст!

Баъдан, мо метавонем кодро дар файли app.py тавассути иҷро кардани он дар консол бо фармони зерин захира кунем:

python3 app.py

Агар ҳама чиз хуб бошад, мо чунин чизе мегирем:

* Ҳолати ислоҳ: фаъол
* Давидан 127.0.0.1:5000/ (Барои баромадан CTRL+C-ро пахш кунед)
* Аз нав оғоз кардан бо стат
* Debugger фаъол аст!
* PIN Debugger: XXXXXXX

Санҷиши API

Пас аз сохтани API, он бояд санҷида шавад.

Инро метавон бо истифода аз утилитаи curl консол ё муштарии Insomnia REST ё тавассути интишори API дар Rapid API анҷом дод.

Навиштани API дар Python (бо Flask ва RapidAPI)

Интишори API-и мо

RapidAPI бузургтарин бозор дар ҷаҳон бо зиёда аз 10 API (ва тақрибан 000 миллион таҳиягарон) мебошад.

RapidAPI на танҳо интерфейси ягонаро барои кор бо API-ҳои тарафи сеюм таъмин мекунад, балки ба шумо имкон медиҳад, ки API-и шахсии худро зуд ва ба осонӣ нашр кунед.

Бо мақсади барои ин кор, шумо аввал бояд онро дар ягон сервери шабака интишор кунед. Дар ҳолати мо, мо истифода хоҳем кард Heroku. Бо ӯ кор кардан набояд душворӣ ба бор орад, (шумо метавонед дар ин ҷо маълумоти бештар гиред).

Чӣ тавр API-и худро дар Heroku нашр кардан мумкин аст

1. Heroku насб кунед.

Қадами аввал ин ба қайд гирифтан ва насб кардани интерфейси хати фармонҳои Heroku (CLI) мебошад. Ин дар Ubuntu 16+ кор мекунад.

sudo snap насб кардани heroku --classic

Пас мо ворид мешавем:

вуруд героку

2. Файлҳои заруриро илова кунед.

Ҳоло мо бояд файлҳоро барои интишор ба ҷузвдони замимаи мо илова кунем:

  • requirements.txt бо рӯйхати модулҳои зарурии Python;
  • Procfile, ки муайян мекунад, ки барои иҷро кардани барнома кадом фармонҳо бояд иҷро шаванд;
  • .gitignore - барои хориҷ кардани файлҳое, ки дар сервер лозим нестанд.

Файли requirements.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

Тела додани филиали усто ба репои дурдасти Ҳероку:

git push heroku master

Акнун шумо метавонед бо кушодани хидмати API бо фармонҳо оғоз кунед:

heroku ps:scale web=1
heroku open
 

API дар он дастрас хоҳад буд your-random-heroku-name.herokuapp.com/ai-quotes.

Чӣ тавр API-и Python-и худро ба бозори RapidAPI илова кардан мумкин аст

Пас аз он ки хидмати API дар Heroku нашр мешавад, шумо метавонед онро ба API Rapid илова кунед. Ин ҷо ҳуҷҷатҳои муфассал дар ин мавзуъ.

1. Ҳисоби RapidAPI эҷод кунед.

Навиштани API дар Python (бо Flask ва RapidAPI)

Мо ҳисоби ройгонро сабти ном мекунем - ин метавонад бо истифода аз Facebook, Google, GitHub анҷом дода шавад.

Навиштани API дар Python (бо Flask ва RapidAPI)

2. Иловаи API ба панели идоракунӣ.

Навиштани API дар Python (бо Flask ва RapidAPI)

3. Баъдан, маълумоти умумиро дар бораи API-и худ ворид кунед.

Навиштани API дар Python (бо Flask ва RapidAPI)

4. Пас аз пахш кардани "Add API" саҳифаи нав пайдо мешавад, ки дар он шумо метавонед маълумотро дар бораи API-и мо ворид кунед.

Навиштани API дар Python (бо Flask ва RapidAPI)

5. Акнун шумо метавонед ё ба таври дастӣ нуқтаҳои API-ро ворид кунед ё зеркашӣ кунед файли swagger бо истифода аз OpenAPI.

Навиштани API дар Python (бо Flask ва RapidAPI)

Хуб, акнун шумо бояд нуқтаҳои ниҳоии API-и моро дар саҳифаи Endpoints насб кунед. Дар ҳолати мо, нуктаҳои ниҳоӣ ба консепсияи CRUD мувофиқат мекунанд (гирифтан, ҷойгир кардан, гузоштан, нест кардан).

Навиштани API дар Python (бо Flask ва RapidAPI)

Баъдан, шумо бояд нуқтаи ниҳоии GET AI Quote эҷод кунед, ки иқтибоси тасодуфиро (агар ID пешфарз бошад) ё иқтибосро барои ID муайяншуда нишон диҳад.

Барои сохтани нуқтаи ниҳоӣ, шумо бояд тугмаи "Эҷоди нуқтаи ниҳоӣ" -ро пахш кунед.

Навиштани API дар Python (бо Flask ва RapidAPI)

Мо ин равандро барои ҳамаи дигар нуқтаҳои ниҳоии API такрор мекунем. Ҳамааш ҳамин! Табрикот, шумо API-и худро нашр кардед!

Агар ҳама чиз хуб бошад, саҳифаи API чунин хоҳад буд:

Навиштани API дар Python (бо Flask ва RapidAPI)

хулоса

Дар ин мақола, мо раванди эҷоди хидмати RESTful API-и худро дар Python, дар баробари раванди интишори API ба абри Heroku ва илова кардани он ба феҳристи RapidAPI тай кардем.

Аммо дар версияи санҷишӣ танҳо принсипҳои асосии таҳияи API нишон дода шуданд - чунин нозукиҳо ба монанди амният, таҳаммулпазирии хатогиҳо ва миқёспазирӣ ба назар гирифта нашудаанд.

Ҳангоми таҳияи API-и воқеӣ, ҳамаи ин бояд ба назар гирифта шавад.

Манбаъ: will.com

Илова Эзоҳ