Писане на API в Python (с Flask и RapidAPI)

Писане на API в Python (с Flask и RapidAPI)

Ако четете тази статия, вероятно вече сте запознати с възможностите, които се отварят при използване на API (Интерфейс за програмиране на приложения).

Като добавите един от многото публични API към вашето приложение, можете да разширите функционалността на това приложение или да го допълните с необходимите данни. Но какво ще стане, ако сте разработили уникална функция, която искате да споделите с общността?

Отговорът е прост: имате нужда създайте свой собствен API.

Въпреки че в началото това може да изглежда като трудна задача, всъщност е доста проста. Ще ви покажем как да направите това с Python.

Какво ви трябва, за да започнете

Разработката на API изисква:

  • Python3;
  • Колба — проста и лесна за използване рамка за създаване на уеб приложения;
  • Колба-ПОЧИВКА е разширение за Flask, което ви позволява да разработите REST API бързо и с минимална конфигурация.

Инсталацията се извършва с командата:

pip install flask-restful

Препоръчваме безплатно интензивно програмиране за начинаещи:
Разработка на Telegram бот в C# — 26–28 август. Безплатен интензивен, който ви позволява да разберете как работят помощните ботове, характеристиките на работа с API на Telegram и други нюанси. Първите трима участници ще получат 30 000 рубли от Skillbox.

Преди да започнете

Ще разработим RESTful API с основен CRUID функционалност.

За да разберем напълно задачата, нека разберем двата термина, споменати по-горе.

Какво е REST?

REST API (Representational State Transfer) е API, който използва HTTP заявки за обмен на данни.

REST API трябва да отговарят на определени критерии:

  • Архитектура клиент-сървър: клиентът взаимодейства с потребителския интерфейс, а сървърът взаимодейства с бекенда и хранилището на данни. Клиентът и сървърът са независими, всеки от тях може да бъде заменен отделно от другия.
  • Без състояние - на сървъра не се съхраняват клиентски данни. Състоянието на сесията се съхранява от страна на клиента.
  • Възможност за кеширане - Клиентите могат да кешират отговорите на сървъра, за да подобрят цялостната производителност.

Какво е 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.

Всеки репо запис ще съдържа:

  • цифров идентификатор;
  • името на автора на цитата;
  • цитат.

Тъй като това е само пример за обучение, ние ще съхраняваме всички записи в списък на 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, post, put, delete.

Нека започнем с метода GET

Тя ви позволява да получите конкретна оферта, като посочите нейния идентификатор, или произволна оферта, ако не е посочен идентификатор.

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 прие ИД на оферта. След това, използвайки reqparse, той извлича автора и цитата от заявката, като ги съхранява в речника на params.

Ако оферта с посочения идентификатор вече съществува, тогава методът показва съответното съобщение и код 400.

Ако все още не е създадена оферта с посочения идентификатор, методът създава нов запис с посочения идентификатор и автор, както и други параметри. След това добавя запис към списъка 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, подобно на предишния пример, взема идентификатор и вход и анализира параметрите на цитата с помощта на 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, за да излезете)
* Рестартиране със стат
* Дебъгерът е активен!
* ПИН код за отстраняване на грешки: XXXXXXX

Тестване на API

След като API е създаден, той трябва да бъде тестван.

Това може да стане с помощта на помощната програма curl console или Insomnia REST клиента, или чрез публикуване на API в Rapid API.

Писане на API в Python (с Flask и RapidAPI)

Публикуване на нашия API

RapidAPI е най-големият пазар в света с над 10 000 API (и около 1 милион разработчици).

RapidAPI не само предоставя единен интерфейс за работа с API на трети страни, но също така ви позволява бързо и лесно да публикувате свой собствен API.

За направи го, първо трябва да го публикувате на някой сървър в мрежата. В нашия случай ще използваме Heroku. Работата с него не трябва да създава никакви затруднения, (можете да научите повече за това тук).

Как да публикувате вашия API на Heroku

1. Инсталирайте Heroku.

Първата стъпка е да се регистрирате и инсталирате интерфейса на командния ред (CLI) на Heroku. Това работи на Ubuntu 16+.

sudo snap install heroku --classic

След това влизаме:

влизане в heroku

2. Добавете необходимите файлове.

Сега трябва да добавим файловете за публикуване в папка в нашето приложение:

  • requirements.txt със списък на необходимите Python модули;
  • Procfile, който указва кои команди трябва да бъдат изпълнени, за да стартира приложението;
  • .gitignore - за изключване на файлове, които не са необходими на сървъра.

Файлът requirements.txt ще съдържа следните редове:

  • колба
  • колба-спокойна
  • гунорог

Моля, обърнете внимание, че добавихме gunicorn (Python WSGI HTTP сървър) към списъка, защото трябва да стартираме нашето приложение на сървъра.

Профилът ще съдържа:

уеб: gunicorn app:app

Съдържание на .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 услугата с командите:

heroku ps:scale web=1
heroku open
 

API ще бъде достъпен на your-random-heroku-name.herokuapp.com/ai-quotes.

Как да добавите вашия API на Python към пазара на RapidAPI

След като API услугата бъде публикувана в Heroku, можете да я добавите към Rapid API. Тук подробна документация по тази тема.

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. След като щракнете върху „Добавяне на API“, се появява нова страница, където можете да въведете информация за нашия API.

Писане на API в Python (с Flask и RapidAPI)

5. Сега можете или ръчно да въведете крайните точки на API, или да изтеглите swagger файл с помощта на OpenAPI.

Писане на API в Python (с Flask и RapidAPI)

Е, сега трябва да зададете крайните точки на нашия API на страницата Крайни точки. В нашия случай крайните точки съответстват на концепцията за CRUD (get, post, put, delete).

Писане на 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 всичко това трябва да се вземе предвид.

Източник: www.habr.com

Добавяне на нов коментар