Pisanie API w Pythonie (z Flask i RapidAPI)

Pisanie API w Pythonie (z Flask i RapidAPI)

Jeśli czytasz ten artykuł, prawdopodobnie znasz już możliwości, jakie otwierają się podczas korzystania z API (Application Programming Interface).

Dodając do swojej aplikacji jedno z wielu publicznych API, możesz rozszerzyć funkcjonalność tej aplikacji lub uzupełnić ją o niezbędne dane. Ale co, jeśli opracowałeś unikalną funkcję, którą chcesz podzielić się ze społecznością?

Odpowiedź jest prosta: potrzebujesz stworzyć własne API.

Choć na początku może się to wydawać trudnym zadaniem, w rzeczywistości jest dość proste. Pokażemy Ci, jak to zrobić w Pythonie.

Czego potrzebujesz, aby zacząć

Rozwój API wymaga:

  • Pythona 3;
  • Kolba — prosty i łatwy w użyciu framework do tworzenia aplikacji internetowych;
  • Kolba-ODPOCZĘTA to rozszerzenie dla Flask, które pozwala szybko i przy minimalnej konfiguracji opracować REST API.

Instalacja odbywa się za pomocą polecenia:

pip install flask-restful

Polecamy bezpłatne intensywne programowanie dla początkujących:
Rozwój bota telegramu w języku C# — 26–28 sierpnia. Bezpłatny program intensywny, który pozwala zrozumieć, jak działają boty pomocnicze, funkcje pracy z interfejsem API Telegrama i inne niuanse. Trzech najlepszych uczestników otrzyma od Skillbox 30 000 rubli.

Zanim zaczniesz

Zamierzamy opracować RESTful API z podstawowym Funkcjonalność CRUID.

Aby w pełni zrozumieć zadanie, przyjrzyjmy się dwóm wyżej wymienionym terminom.

Co to jest ODPOCZYNEK?

REST API (Representational State Transfer) to interfejs API, który wykorzystuje żądania HTTP do wymiany danych.

Interfejsy API REST muszą spełniać określone kryteria:

  • Architektura klient-serwer: klient wchodzi w interakcję z interfejsem użytkownika, a serwer współdziała z zapleczem i magazynem danych. Klient i serwer są niezależne, każdy z nich może być zastąpiony niezależnie od drugiego.
  • Bezstanowe — żadne dane klienta nie są przechowywane na serwerze. Stan sesji jest przechowywany po stronie klienta.
  • Możliwość buforowania — klienci mogą buforować odpowiedzi serwera w celu poprawy ogólnej wydajności.

Co to jest CRUD?

OKRUTNY to koncepcja programistyczna opisująca cztery podstawowe czynności (tworzenie, odczytywanie, aktualizowanie i usuwanie).

W REST API typy żądań i metody żądań odpowiadają za akcje takie jak post, get, put, delete.

Teraz, gdy omówiliśmy podstawowe pojęcia, możemy przystąpić do tworzenia API.

Rozwój

Stwórzmy repozytorium cytatów o sztucznej inteligencji. AI jest obecnie jedną z najszybciej rozwijających się technologii, a Python jest popularnym narzędziem do pracy z AI.

Dzięki temu interfejsowi programista Pythona może szybko dowiedzieć się o sztucznej inteligencji i zainspirować się nowymi osiągnięciami. Jeśli deweloper ma wartościowe przemyślenia na ten temat, będzie mógł dodać je do repozytorium.

Zacznijmy od zaimportowania wymaganych modułów i skonfigurowania Flask:

from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)

W tym fragmencie potrzebne nam są klasy Flask, Api i Resource.

Reqparse to interfejs analizowania żądań Flask-RESTful... Będziesz także potrzebował modułu losowego, aby wyświetlić losową wycenę.

Teraz stworzymy repozytorium cytatów o AI.

Każdy wpis repo będzie zawierał:

  • identyfikator cyfrowy;
  • nazwisko autora cytatu;
  • cytat.

Ponieważ jest to tylko przykład edukacyjny, będziemy przechowywać wszystkie wpisy na liście Pythona. W prawdziwej aplikacji najprawdopodobniej zamiast tego użylibyśmy bazy danych.

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

Teraz musimy utworzyć klasę zasobów Quote, która zdefiniuje operacje naszych punktów końcowych API. Wewnątrz klasy należy zadeklarować cztery metody: get, post, put, delete.

Zacznijmy od metody GET

Pozwala uzyskać konkretną wycenę poprzez podanie jej identyfikatora lub losową wycenę, jeśli nie określono żadnego identyfikatora.

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

Metoda GET zwraca losowy cudzysłów, jeśli identyfikator zawiera wartość domyślną, tj. podczas wywoływania identyfikator metody nie został ustawiony.

Jeśli jest ustawiona, to metoda przeszukuje cudzysłowy i znajduje ten, który zawiera podany identyfikator. Jeśli nic nie zostanie znalezione, zostanie wyświetlony komunikat „Cytat nie został znaleziony, 404”.

Pamiętaj, że metoda zwraca stan HTTP 200, jeśli żądanie powiodło się i 404, jeśli wpis nie został znaleziony.

Teraz utwórzmy metodę POST, aby dodać nowy cytat do repozytorium

Otrzyma identyfikator każdego nowego cytatu podczas pisania. Ponadto POST użyje reqparse do przeanalizowania parametrów, które trafią do treści żądania (tekst autora i cytatu).

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

W powyższym kodzie metoda POST akceptowała identyfikator cytatu. Następnie, używając reqparse, pobrał autora i cytat z żądania, przechowując je w słowniku params.

Jeśli cytat o podanym ID już istnieje, to metoda wyświetla odpowiedni komunikat i kod 400.

Jeśli cytat o podanym identyfikatorze nie został jeszcze utworzony, metoda tworzy nowy wpis z podanym identyfikatorem i autorem oraz innymi parametrami. Następnie dodaje wpis do listy ai_quotes i zwraca wpis z nowym cytatem wraz z kodem 201.

Teraz tworzymy metodę PUT, aby zmienić istniejący cytat w repozytorium

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

Metoda PUT, podobnie jak w poprzednim przykładzie, pobiera identyfikator i dane wejściowe i analizuje parametry cytatu za pomocą reqparse.

Jeśli cytat o podanym identyfikatorze istnieje, metoda zaktualizuje go o nowe parametry, a następnie wyświetli zaktualizowany cytat z kodem 200. Jeśli nie ma jeszcze cytatu o określonym identyfikatorze, zostanie utworzony nowy rekord z kodem 201.

Na koniec stwórzmy metodę DELETE, aby usunąć cytat, który nie jest już inspirujący.

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

Ta metoda pobiera identyfikator cytatu jako dane wejściowe i aktualizuje listę ai_quotes przy użyciu udostępnionej listy.

Teraz, gdy stworzyliśmy wszystkie metody, wszystko, co musimy zrobić, to po prostu dodać zasób do API, ustawić ścieżkę i uruchomić Flask.

api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
    app.run(debug=True)

Nasza usługa REST API jest gotowa!

Następnie możemy zapisać kod do pliku app.py, uruchamiając go w konsoli za pomocą polecenia:

python3 app.py

Jeśli wszystko jest w porządku, otrzymamy coś takiego:

* Tryb debugowania: włączony
* Kontynuować 127.0.0.1:5000/ (Naciśnij CTRL+C, aby wyjść)
* Ponowne uruchamianie ze stat
* Debuger jest aktywny!
* Kod PIN debugera: XXXXXXX

Testowanie API

Po utworzeniu interfejsu API należy go przetestować.

Można to zrobić za pomocą narzędzia konsoli curl lub klienta Insomnia REST lub publikując API w Rapid API.

Pisanie API w Pythonie (z Flask i RapidAPI)

Publikowanie naszego API

RapidAPI to największy rynek na świecie z ponad 10 000 interfejsów API (i około 1 milionem programistów).

RapidAPI nie tylko zapewnia pojedynczy interfejs do pracy z interfejsami API innych firm, ale także pozwala szybko i łatwo opublikować własny interfejs API.

Do Zrób to, musisz najpierw opublikować go na jakimś serwerze w sieci. W naszym przypadku skorzystamy Heroku. Współpraca z nim nie powinna sprawiać żadnych trudności, (możesz dowiedzieć się więcej na ten temat tutaj).

Jak opublikować swoje API na Heroku

1. Zainstaluj Heroku.

Pierwszym krokiem jest zarejestrowanie i zainstalowanie interfejsu wiersza poleceń Heroku (CLI). Działa to na Ubuntu 16+.

sudo snap install heroku --classic

Następnie logujemy się:

Zaloguj się do heroku

2. Dodaj niezbędne pliki.

Teraz musimy dodać pliki do publikacji do folderu w naszej aplikacji:

  • wymagania.txt z listą wymaganych modułów Pythona;
  • Procfile, który określa, które polecenia należy wykonać, aby uruchomić aplikację;
  • .gitignore — aby wykluczyć pliki, które nie są potrzebne na serwerze.

Plik wymagania.txt będzie zawierał następujące wiersze:

  • kolba
  • kolby-spokojny
  • Gunicorn

Zwróć uwagę, że dodaliśmy do listy gunicorn (Python WSGI HTTP Server), ponieważ musimy uruchomić naszą aplikację na serwerze.

Procfile będzie zawierał:

web: gunicorn aplikacja: aplikacja

Zawartość .gitignore:

*.pyc
__pycache__/

Teraz, gdy pliki są utworzone, zainicjujmy repozytorium git i zatwierdźmy:

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

3. Utwórz nową aplikację Heroku.

heroku create

Wypychanie gałęzi master do zdalnego repozytorium Heroku:

git push heroku master

Teraz możesz zacząć od otwarcia usługi API za pomocą poleceń:

heroku ps:scale web=1
heroku open
 

API będzie dostępne pod adresem twoja-random-heroku-name.herokuapp.com/ai-quotes.

Jak dodać interfejs API Pythona do rynku RapidAPI

Gdy usługa API zostanie opublikowana na Heroku, możesz dodać ją do Rapid API. Tutaj szczegółowa dokumentacja w tym temacie.

1. Utwórz konto RapidAPI.

Pisanie API w Pythonie (z Flask i RapidAPI)

Rejestrujemy bezpłatne konto - można to zrobić za pomocą Facebooka, Google, GitHub.

Pisanie API w Pythonie (z Flask i RapidAPI)

2. Dodaj API do panelu sterowania.

Pisanie API w Pythonie (z Flask i RapidAPI)

3. Następnie wprowadź ogólne informacje o swoim API.

Pisanie API w Pythonie (z Flask i RapidAPI)

4. Po kliknięciu „Dodaj API” pojawi się nowa strona, na której możesz wprowadzić informacje o naszym API.

Pisanie API w Pythonie (z Flask i RapidAPI)

5. Teraz możesz ręcznie wprowadzić punkty końcowe API lub pobrać plik swaggera przy użyciu OpenAPI.

Pisanie API w Pythonie (z Flask i RapidAPI)

Cóż, teraz musisz ustawić punkty końcowe naszego API na stronie Punkty końcowe. W naszym przypadku punkty końcowe odpowiadają koncepcji CRUD (get, post, put, delete).

Pisanie API w Pythonie (z Flask i RapidAPI)

Następnie musisz utworzyć punkt końcowy GET AI Quote, który wyświetla losowy cytat (jeśli identyfikator jest domyślny) lub cytat dla określonego identyfikatora.

Aby utworzyć punkt końcowy, musisz kliknąć przycisk „Utwórz punkt końcowy”.

Pisanie API w Pythonie (z Flask i RapidAPI)

Powtarzamy ten proces dla wszystkich innych punktów końcowych interfejsu API. To wszystko! Gratulacje, opublikowałeś swoje API!

Jeśli wszystko pójdzie dobrze, strona API będzie wyglądać mniej więcej tak:

Pisanie API w Pythonie (z Flask i RapidAPI)

wniosek

W tym artykule omówiliśmy proces tworzenia własnej usługi RESTful API w Pythonie, wraz z procesem publikowania API w chmurze Heroku i dodawania go do katalogu RapidAPI.

Ale w wersji testowej pokazano tylko podstawowe zasady tworzenia API - nie uwzględniono takich niuansów jak bezpieczeństwo, odporność na uszkodzenia i skalowalność.

Podczas opracowywania prawdziwego API należy to wszystko wziąć pod uwagę.

Źródło: www.habr.com

Dodaj komentarz