Pythonдо API жазуу (Flask жана RapidAPI менен)

Pythonдо API жазуу (Flask жана RapidAPI менен)

Эгер сиз бул макаланы окуп жатсаңыз, сиз API (Программалоо интерфейси) колдонууда ачылган мүмкүнчүлүктөр менен мурунтан эле тааныш болсоңуз керек.

Колдонмоңузга көптөгөн коомдук API'лердин бирин кошуу менен, сиз бул колдонмонун функцияларын кеңейте аласыз же аны керектүү маалыматтар менен толуктай аласыз. Бирок коомчулук менен бөлүшкүңүз келген уникалдуу функцияны иштеп чыксаңызчы?

Жооп жөнөкөй: сизге керек өз API түзүү.

Бул алгач оор иш болуп көрүнгөнү менен, чынында, абдан жөнөкөй. Биз муну Python менен кантип жасоону көрсөтөбүз.

Баштоо үчүн эмне керек

API иштеп чыгуу талап кылынат:

  • Python3;
  • кумура — веб-тиркемелерди түзүү үчүн жөнөкөй жана колдонууга оңой алкак;
  • Flask-RESTful REST APIди тез жана минималдуу конфигурация менен иштеп чыгууга мүмкүндүк берген Flask үчүн кеңейтүү.

Орнотуу төмөнкү буйрук менен жүзөгө ашырылат:

pip install flask-restful

Биз үйрөнчүктөр үчүн акысыз интенсивдүү программалоону сунуштайбыз:
C# тилинде Telegram ботун иштеп чыгуу — 26-28-август. Жардамчы боттор кантип иштээрин, Telegram API менен иштөөнүн өзгөчөлүктөрүн жана башка нюанстарды түшүнүүгө мүмкүндүк берген акысыз интенсивдүү. Алдыңкы үч катышуучуга Skillbox компаниясынан 30 000 рубль берилет.

Баштоодон мурун

Биз негизги менен RESTful API иштеп чыгабыз CRUID функциясы.

Тапшырманы толук түшүнүү үчүн жогоруда айтылган эки терминди түшүнөлү.

REST деген эмне?

REST API (Өкүлчүлүк мамлекеттик өткөрүп берүү) маалымат алмашуу үчүн HTTP сурамдарын колдонгон API болуп саналат.

REST API'лери белгилүү критерийлерге жооп бериши керек:

  • Кардар-сервер архитектурасы: кардар колдонуучу интерфейси менен өз ара аракеттенет, ал эми сервер сервер жана маалымат сактагычы менен иштешет. Кардар жана сервер көз карандысыз, алардын каалаганын башкасынан өзүнчө алмаштырууга болот.
  • Жарандыгы жок - серверде эч кандай кардар маалыматы сакталбайт. Сеанс абалы кардар тарабында сакталат.
  • Кэш жөндөмдүүлүгү - Кардарлар жалпы иштөөнү жакшыртуу үчүн сервердин жоопторун кэштей алышат.

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

Эми биз API акыркы чекиттерибиздин операцияларын аныктай турган Quote ресурс классын түзүшүбүз керек. Класс ичинде төрт ыкма жарыяланышы керек: алуу, жарыялоо, коюу, өчүрүү.

GET ыкмасы менен баштайлы

Бул анын идентификаторун көрсөтүү менен белгилүү бир цитатаны алууга мүмкүндүк берет, же 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 камтылганды табат. Эгерде эч нерсе табылбаса, "Цитата табыла элек, 404" билдирүүсү көрсөтүлөт.

Эсиңизде болсун, эгер өтүнүч ийгиликтүү болсо, метод 200 HTTP статусун кайтарат, ал эми жазуу табылбаса 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 ыкмасын түзөбүз

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

Бул ыкма цитата идентификаторун киргизүү катары кабыл алат жана бөлүшүлгөн тизмени колдонуу менен 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 басыңыз)
* Статистика менен кайра баштоо
* Мүчүлүштүктөрдү оңдоочу активдүү!
* Мүчүлүштүктөрдү оңдоочу PIN: XXXXXXX

API сыналууда

API түзүлгөндөн кийин, аны текшерүү керек.

Бул curl консолунун утилитасын же Insomnia REST кардарын колдонуу менен же APIди Rapid API'ге жарыялоо менен жасалышы мүмкүн.

Pythonдо API жазуу (Flask жана RapidAPI менен)

Биздин API жарыялоо

RapidAPI - 10 000ден ашык API (жана 1 миллионго жакын иштеп чыгуучулар) менен дүйнөдөгү эң чоң базар.

RapidAPI үчүнчү тараптын API'лери менен иштөө үчүн бирдиктүү интерфейсти гана камсыз кылбастан, ошондой эле өз API'ңизди тез жана оңой жарыялоого мүмкүнчүлүк берет.

үчүн ушуну жасоо, адегенде аны тармактагы кандайдыр бир серверге жарыялооңуз керек. Биздин учурда, биз колдонобуз Жиберүү. Аны менен иштөө эч кандай кыйынчылык жаратпашы керек, (бул жөнүндө көбүрөөк биле аласыз).

Heroku боюнча API'ни кантип жарыялоо керек

1. Heroku орнотуу.

Биринчи кадам Heroku Command Line Interface (CLI) каттоо жана орнотуу болуп саналат. Бул Ubuntu 16+ иштейт.

sudo snap орнотуу heroku --classic

Андан кийин биз киребиз:

heroku кирүү

2. Керектүү файлдарды кошуңуз.

Эми биз тиркемедеги папкага жарыялоо үчүн файлдарды кошушубуз керек:

  • талап кылынган Python модулдарынын тизмеси менен талаптар.txt;
  • Procfile, ал тиркемени иштетүү үчүн кандай буйруктар аткарылышы керек экендигин аныктайт;
  • .gitignore - серверде кереги жок файлдарды алып салуу үчүн.

талаптар.txt файлы төмөнкү саптарды камтыйт:

  • колба
  • колба-тынч
  • guniccorn

Сураныч, биз тизмеге gunicorn (Python WSGI HTTP Server) кошконубузду эске алыңыз, анткени биздин тиркемени серверде иштетишибиз керек.

Профайл төмөнкүлөрдү камтыйт:

веб: gunicorn колдонмосу: колдонмо

.gitignore мазмуну:

*.pyc
__pycache__/

Эми файлдар түзүлгөндөн кийин, келгиле, git репо инициализациялайлы жана аткаралы:

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

3. Жаңы Heroku колдонмосун түзүңүз.

heroku create

Мастер бутагын алыскы Heroku репосуна түртүп:

git push heroku master

Эми сиз API кызматын буйруктар менен ачуу менен баштасаңыз болот:

heroku ps:scale web=1
heroku open
 

API жеткиликтүү болот your-random-heroku-name.herokuapp.com/ai-quotes.

Python API'ни RapidAPI базарына кантип кошуу керек

API кызматы Heroku сайтында жарыялангандан кийин, аны Rapid API'ге кошо аласыз. Мына деталдуу документтер бул темада.

1. RapidAPI каттоо эсебин түзүңүз.

Pythonдо API жазуу (Flask жана RapidAPI менен)

Биз акысыз каттоо эсебин каттайт - бул Facebook, Google, GitHub аркылуу жасалышы мүмкүн.

Pythonдо API жазуу (Flask жана RapidAPI менен)

2. Башкаруу панелине API кошуңуз.

Pythonдо API жазуу (Flask жана RapidAPI менен)

3. Андан кийин, API жөнүндө жалпы маалыматты киргизиңиз.

Pythonдо API жазуу (Flask жана RapidAPI менен)

4. "Add API" дегенди басканда, сиз биздин API жөнүндө маалыматты киргизе турган жаңы барак пайда болот.

Pythonдо API жазуу (Flask жана RapidAPI менен)

5. Эми сиз API акыркы чекиттерин кол менен киргизип же жүктөп алсаңыз болот swagger файлы OpenAPI колдонуу.

Pythonдо API жазуу (Flask жана RapidAPI менен)

Эми сиз биздин API'нин акыркы чекиттерин Endpoints бетине коюшуңуз керек. Биздин учурда, акыркы чекиттер CRUD концепциясына туура келет (ал, жайгаштыруу, коюу, жок кылуу).

Pythonдо API жазуу (Flask жана RapidAPI менен)

Андан кийин, сиз GET AI Quote акыркы чекитин түзүшүңүз керек, анда кокус цитата (эгер ID демейки болсо) же көрсөтүлгөн ID үчүн цитата көрсөтүлөт.

Акыркы чекитти түзүү үчүн, сиз "Соңку чекитти түзүү" баскычын басышыңыз керек.

Pythonдо API жазуу (Flask жана RapidAPI менен)

Бул процессти бардык башка API акыркы чекиттери үчүн кайталайбыз. Баары болду! Куттуктайбыз, сиз API'ңизди жарыяладыңыз!

Эгер баары ойдогудай болсо, API баракчасы төмөнкүдөй көрүнөт:

Pythonдо API жазуу (Flask жана RapidAPI менен)

жыйынтыктоо

Бул макалада биз APIди Heroku булутуна жарыялоо жана аны RapidAPI каталогуна кошуу процесси менен бирге Pythonдо өзүбүздүн RESTful API кызматыбызды түзүү процессин басып өттүк.

Бирок тесттик версияда API иштеп чыгуунун негизги принциптери гана көрсөтүлгөн - коопсуздук, катага сабырдуулук жана масштабдуулук сыяктуу нюанстар каралган эмес.

Чыныгы API иштеп чыгууда мунун бардыгын эске алуу керек.

Source: www.habr.com

Комментарий кошуу