flask api tutorial with example extending flask with apis
Ten samouczek interfejsu Flask API wyjaśnia popularne rozszerzenia Flask, takie jak Flask twitter Oembedder, Flask API i Flask RESTful z przykładami:
Framework Flask ma dość dużą liczbę rozszerzeń. Te rozszerzenia są bardzo przydatne i łatwe do opracowania. Wiemy, że platforma Flask jest bardzo Pythonowa i ma minimalny zestaw interfejsów API oraz jest bardzo elastyczna, dlatego społeczność Flask stworzyła tak wiele rozszerzeń do wielu konkretnych zadań.
Jako część serii samouczków Flask, ten samouczek zawiera przykład kilku rozszerzeń Flask. Omówimy następujące rozszerzenia.
- Twitter kolby Oembedder
- Flask API
- Flask RESTful
=> Odwiedź tutaj, aby nauczyć się Flask od podstaw
Chociaż omówiliśmy wiele rozszerzeń w ramach naszych poprzednich samouczków, ten samouczek wyjaśnia więcej z perspektywy badania składników rozszerzenia Flask.
Czego się nauczysz:
Co to jest rozszerzenie kolby
Rozszerzenie flask to instalowalny moduł Pythona lub pakiet, który implementuje dodatkowe funkcje do aplikacji Flask. Rozszerzenie Flask może być tak proste, jak to, które dodaje obsługę korzystania z zewnętrznego interfejsu API, takiego jak Twitter, w celu osadzenia tweeta na stronie internetowej.
Lub rozszerzenie Flask może być nową strukturą, taką jak Flask API lub Flask-RESTful do tworzenia aplikacji zgodnych ze wzorcem architektonicznym lub paradygmatem programistycznym.
Twitter kolby Oembedder
W tej sekcji weźmiemy przykład istniejącego prostego projektu open source z tutaj
Sklonuj ten projekt na komputerze lokalnym i zainstaluj go za pomocą pip za pomocą poniższego polecenia.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
To rozszerzenie pomaga w osadzaniu tweeta za pomocą tagu szablonu Jinja2. Jednak aby użyć tego rozszerzenia, będziesz musiał złożyć wniosek o konto programisty na Twitterze. Po uzyskaniu konta programisty utwórz aplikację, a otrzymasz klucze i dane tajne potrzebne do korzystania z interfejsu API Twittera.
gdzie oglądać anime online za darmo
Gdy masz już klucze i sekrety, przechowuj je w bezpiecznym miejscu, aby aplikacja miała do nich dostęp. Zachowaliśmy je w zmiennych środowiskowych i dodaliśmy do konfiguracji aplikacji Flask, jak pokazano poniżej. Nasza aplikacja demonstracyjna przechowuje wartości konfiguracyjne w pliku config.py.
# Twitter details import os TWITTER_ACCESS_TOKEN = os.environ.get('TWITTER_ACCESS_TOKEN', None) TWITTER_TOKEN_SECRET = os.environ.get('TWITTER_TOKEN_SECRET', None) TWITTER_CONSUMER_KEY = os.environ.get('TWITTER_CONSUMER_KEY', None) TWITTER_CONSUMER_SECRET = os.environ.get('TWITTER_CONSUMER_SECRET', None)
Wartości wymaganych zmiennych uzyskujemy ze zmiennych środowiskowych. Jeśli odpowiednia wartość nie jest obecna w zmiennej środowiskowej, jest przechowywana jako Brak.
Po dodaniu powyższych wierszy w pliku konfiguracyjnym przejdź do pliku __init__.py aplikacji Flask i zainicjuj go, modyfikując go, jak pokazano poniżej.
from flask_caching import Cache from flask_twitter_oembedder import TwitterOEmbedder cache = Cache(app, config={'CACHE_TYPE': 'simple'}) twitter_oembedder = TwitterOEmbedder(app, cache)
Te linie zainicjują rozszerzenie Flask. Teraz możemy zmodyfikować hello.html w szablonach i dodać wspomniany poniżej tag, jak pokazano poniżej.
{{ oembed_tweet('1277228221394587649') }}
Dodaliśmy ten tag przed pętlą for w istniejącym szablonie. Ta bardzo długa cyfra to identyfikator tweeta. Otrzymujemy ten identyfikator z adresu URL tweeta po tweetowaniu. Po zapisaniu pliku szablonu przechodzimy do punktu końcowego / hello / greetings i otrzymujemy wyniki, jak pokazano na poniższym obrazku.

Flask RESTful
Nasza przykładowa aplikacja Flask RESTful jest tą, która respektuje ograniczenia architektury REST. Jednak nie jest to protokół, a programiści są elastyczni podczas implementowania funkcji, zgodnie z ograniczeniami REST.
Przeczytaj więcej o ograniczeniach architektury REST tutaj .
Nowoczesne aplikacje internetowe umożliwiają klientom żądanie zasobów z łatwych do odczytania i stabilnych punktów końcowych w sposób bezstanowy.
Przykład RESTful kolby
Zaimplementujmy niektóre funkcje w sposób RESTful w naszej przykładowej aplikacji Flask RESTful.
Mamy sposób na przechowywanie i udostępnianie danych związanych z albumami i utworami. Zaimplementujmy interfejs API przy użyciu rozszerzenia Flask RESTful.
Najpierw zainstaluj Flask RESTful za pomocą poniższego polecenia.
pip install flask-restful
Aby ułatwić konserwację i zrozumienie, utwórzmy plik o nazwie api.py w katalogu aplikacji i wspomnijmy o następujących wierszach kodu. Na razie rozważ interfejsy API podobne do widoków Flask.
Zamierzamy zaimplementować funkcje odpowiadające czasownikom HTTP, aby odpowiedzieć, gdy Klient wyśle żądanie do punktu końcowego serwera aplikacji.
from flask import request from flask_restful import Resource, reqparse, abort, Api from . import app api = Api(app, prefix='/myapi/v1') def abort_if_song_doesnt_exist(song_name): if song_name not in SONGS: abort(404, message='Song {} doesn't exist'.format(song_name)) parser = reqparse.RequestParser() parser.add_argument('title') parser.add_argument('singer') SONGS = { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } class Songs(Resource): def get(self): return {'songs': SONGS} def post(self): args = parser.parse_args(strict=True) song_name = int(max(SONGS.keys()).lstrip('Song')) + 1 song_name = 'Song%d' % song_name SONGS(song_name) = {'title': args('title'), 'singer': args('singer')} return { song_name:SONGS(song_name) }, 201 api.add_resource(Songs, '/songs') class Song(Resource): def get(self, song_name): abort_if_song_doesnt_exist(song_name) return { song_name: SONGS(song_name) } def delete(self, song_name): abort_if_song_doesnt_exist(song_name) del SONGS(song_name) return '', 204 def put(self, song_name): args = parser.parse_args(strict=True) abort_if_song_doesnt_exist(song_name) SONGS(song_name) = {'title': args('title'), 'singer': args('singer')} return { song_name: SONGS(song_name) }, 201 api.add_resource(Song, '/songs/')
Stworzyliśmy dwa zasoby o nazwie Songs i Song poprzez podklasę Resource abstract class z Flask-RESTful. Klasa o nazwie Songs ma dwie metody get i post odpowiadające dwóm czasownikom HTTP; GET i POST, odpowiednio.
Zasób Utwory dostarcza wszystkie utwory do zarejestrowanego punktu końcowego, gdy klient tego zażąda, i dodaje utwór do listy istniejących utworów, gdy dane są publikowane w tym samym punkcie końcowym.
Podobnie, w przypadku klasy Song, HTTP GET, DELETE i PUT są implementowane przy użyciu metod get, delete i put. Metoda get wysyła odpowiedź z żądanym utworem jako JSON, metoda delete usuwa utwór z SONGS, a metoda put aktualizuje istniejący utwór w SONGS.
Teraz dodajmy te zasoby do naszej przykładowej aplikacji, inicjując je w pliku __init__.py w folderze aplikacji.
from . import api
Zainstalujmy curl i wypróbujmy funkcje w podanych punktach końcowych.
sudo apt -y install curl
Pobierz wszystkie utwory
curl -k https://localhost:8080/api/v1/songs
Otrzymujemy odpowiedź, jak pokazano poniżej.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
Teraz użyjmy poniższego polecenia, aby dodać piosenkę.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Otrzymujemy odpowiedź z naszego API, jak pokazano poniżej.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
Teraz znowu, jeśli zapytamy listę piosenek, tak jak zrobiliśmy to w poprzednim poleceniu, otrzymamy obie piosenki w odpowiedzi.
czym różni się C ++ od Java
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' }, 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } } }
Podobnie HTTP DELETE i PUT działają zgodnie z zamierzeniami. Dodajmy kilka testów dla wersji v1 tego prostego API, które stworzyliśmy.
def test_myapi_v1_songs(client): resp = client.get('/api/v1/songs/') #import pdb;pdb.set_trace() assert 200 == resp.status_code def test_myapi_v1_add_song(client): ''' The application can store the same data multiple times''' data = { 'title': 'Summer Days', 'singer': 'Martin Garrix' } resp = client.post( '/api/v1/songs/', data=data ) assert 201 == resp.status_code
Teraz uruchom te testy z wiersza poleceń, jak pokazano poniżej.
pytest app/tests/test_api.py
Podobnie możemy napisać testy dla innych metod, aby uzyskać większe pokrycie.
Ważną rzeczą do odnotowania jest to, że dodane przez nas utwory są nadal częścią pojedynczego procesu, w ramach którego działa serwer deweloperski. Oznacza to, że wszystkie nowe dane zostaną utracone, gdy tylko proces się zakończy.
Ponadto zadanie stworzenia wersji v1 API wydaje się zbędne i różni się od sposobu, w jaki zapisywaliśmy dane w aplikacji za pomocą formularzy i widoków.
Zazwyczaj implementacja RESTful API wymaga pobierania danych od klientów, kierowania między końcami klienta i serwera oraz trwałości przy pomocy stworzonych przez nas modeli baz danych.
Ponadto punkty końcowe są zabezpieczone przed niezamierzonymi i spreparowanymi danymi wejściowymi.
Dlatego zalecamy, aby podane powyżej przykłady służyły jedynie poznaniu pojęć i ograniczeń architektury REST przy użyciu metod HTTP. Należy pamiętać, że jest to tylko jeden z wielu generalnie sposobów tworzenia usług internetowych. Ponadto istnieje wiele sposobów implementacji architektury REST.
Zachęcamy czytelników do dalszego zbadania, w jaki sposób REST może mieć różne formaty plików i niestandardowe metody przy użyciu innych protokołów, a nie tylko JSON i HTTP. Aby rzucić okiem na jedno zastosowanie produkcyjne, podajemy poniższy przykład.
Używamy Flask-Appbuilder BaseApi do implementacji podobnych funkcji w różnych punktach końcowych. Otwórz plik api.py i zaktualizuj go poniższym kodem.
APIs using appbuilder from flask_appbuilder.api import BaseApi, expose from . import appbuilder class SongsApi(BaseApi): resource_name = 'songs' @expose('/', methods=('POST', 'GET')) def songs(self): if request.method == 'GET': return self.response(200, songs=SONGS) else: args = parser.parse_args(strict=True) song_name = int(max(SONGS.keys()).lstrip('Song')) + 1 song_name = 'Song%d' % song_name SONGS(song_name) = {'title': args('title'), 'singer': args('singer')} return self.response(201, song=SONGS(song_name)) appbuilder.add_api(SongsApi) class SongApi(BaseApi): resource_name = 'songs' @expose('/', methods=('GET', 'DELETE', 'PUT')) def song(self, song_name): if request.method == 'GET': abort_if_song_doesnt_exist(song_name) return self.response(200, song_name=SONGS(song_name) ) elif request.method == 'DELETE': abort_if_song_doesnt_exist(song_name) del SONGS(song_name) return self.response(204, message='OK') elif request.method == 'PUT': args = parser.parse_args(strict=True) abort_if_song_doesnt_exist(song_name) SONGS(song_name) = {'title': args('title'), 'singer': args('singer')} return self.response(201, song_name=SONGS(song_name)) else: self.response_404() appbuilder.add_api(SongApi)
Teraz dodajmy więcej testów, aby przetestować punkty końcowe, które są tworzone przy użyciu Flask-Appbuilder. Przeprowadzimy te testy za pomocą PyTest.
def test_v1_songs(client): resp = client.get('/api/v1/songs/', follow_redirects=True) #import pdb;pdb.set_trace() assert 200 == resp.status_code def test_v1_add_song(client): ''' The application can store the same data multiple times''' # Get the existing number of songs resp = client.get('/api/v1/songs/', follow_redirects=True) data = { 'title': 'Summer Days', 'singer': 'Martin Garrix' } resp = client.post( '/api/v1/songs/', data=data, follow_redirects=True ) assert 201 == resp.status_code
Flask-Appbuilder pomaga również w dostarczaniu interfejsu użytkownika Swagger do wyświetlania i wypróbowywania opublikowanego interfejsu API. Otwórz config.py i zaktualizuj go za pomocą konfiguracji pokazanej poniżej.
FAB_API_SWAGGER_UI=True
Teraz przejdź do https: // localhost: 8080 / swaggerview / v1, a będziesz mógł zobaczyć widok Swagger, jak pokazano poniżej.

Teraz utwórzmy interfejsy API dla istniejących modeli baz danych, które mamy. Musimy użyć ModelApi programu Flask-Appbuilder.
Zaktualizuj plik api.py, dodając następujące wiersze kodu.
from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.api import ModelRestApi from .models import Song as SongModel class MySongModelApi(ModelRestApi): resource_name = 'newsongs' datamodel = SQLAInterface(SongModel) appbuilder.add_api(MySongModelApi)
Po zdefiniowaniu klasy opartej na ModelRestApi musimy ponownie zarejestrować ją w Flask-Appbuilder za pomocą metody add_api.
Teraz przejdź do interfejsu użytkownika Swagger, jak wcześniej, a zobaczysz odwołanie do interfejsu API podobne do pokazanego poniżej.

Możesz wypróbować interfejs API z widoku Swagger lub wysyłając curl do punktów końcowych, jak wcześniej.
Flask API
Flask API to framework, który jest dość podobny do frameworka Django REST. Możesz uzyskać dostęp do dokumentacji interfejsu Flask API tutaj . Jest to bezpośredni zamiennik platformy Flask.
Możemy wybrać dowolny z podanych powyżej przykładów, aby zaimplementować w naszej aplikacji funkcje sterowane przez Flask REST API.
Zatwierdźmy teraz źródło i opublikujmy zmiany w repozytorium pochodzenia za pomocą Gita. Gdy tylko zatwierdzimy źródło z nazwą gałęzi i wyślemy żądanie ściągnięcia, testy jednostkowe zostaną automatycznie wyzwolone w ramach akcji Git w ramach sprawdzania żądań ściągnięcia.
Butelka RestPlus
Flask RestPlus to jeszcze jedno rozszerzenie Flask, które pomaga w tworzeniu REST API przy użyciu Flask. Ten projekt został podzielony na inne rozszerzenie o nazwie Flask-RESTX i nie jest już obsługiwany.
Ten projekt ma dobrą kolekcję dekoratorów do opisywania interfejsów API i ujawnia swoją dokumentację za pomocą Swaggera. Możesz sprawdzić szczegóły tego projektu tutaj .
Często Zadawane Pytania
Pytanie 1) Jak utworzyć interfejs API REST za pomocą Flask?
Odpowiedź: Możemy używać frameworka Flask z innymi rozszerzeniami Flask, takimi jak Flask-RESTful, Flask API, Flask RESTX, Connexion itp., Aby tworzyć aplikacje internetowe oparte na REST API. Większość rozszerzeń współpracuje z innymi wbudowanymi funkcjami platformy Flask i innymi istniejącymi bibliotekami ORM /.
P # 2) Co to jest przykład interfejsu API REST?
Odpowiedź: Przykładowa aplikacja, która implementuje interfejs API RESTFul, jest podana w tym samouczku. Do stworzenia przykładowej aplikacji użyto Flask-RESTful. Przeczytaj o przykładowej sekcji Flask RESTful w tym samouczku.
Pytanie 3) Do czego służy interfejs RESTful API?
Odpowiedź: Interfejs programowania aplikacji, który zazwyczaj używa żądań HTTP i ma odpowiednie metody zaplecza dla czasowników HTTP, takich jak GET, POST, PUT, itp., Aby umożliwić komunikację między klientem a serwerem, nazywa się RESTful API.
jaka jest nazwa użytkownika i hasło mojego routera
Taka aplikacja jest zgodna z zasadami i ograniczeniami architektury REST w celu zaimplementowania jej funkcji.
Wniosek
Omówiliśmy koncepcje rozszerzeń Flask za pomocą trzech rozszerzeń, takich jak Flask-twitter-oembedder, Flask API i Flask-RESTful.
Z pomocą Flask-twitter-oembedder omówiliśmy również koncepcje Twitter API. Ogólnie rzecz biorąc, uwzględniliśmy również pomysły dotyczące implementacji usługi internetowej RESTful, która jest zgodna z zasadami i ograniczeniami architektury REST.
W następnym samouczku omówimy porównanie między frameworkiem Django i Flask, aby pomóc naszym czytelnikom zrozumieć mocne i słabe strony obu frameworków. Pomoże również w wyborze jednego frameworka względem drugiego w oparciu o konkretne wymagania projektu.
=> Poznaj serię treningów Simple Flask tutaj
rekomendowane lektury
- Samouczek testowania interfejsu API: kompletny przewodnik dla początkujących
- Samouczek dotyczący REST API: Architektura i ograniczenia interfejsu API REST
- Parasoft SOAtest Tutorial: Bezskryptowe narzędzie do testowania API
- Jak stworzyć dokumentację API w Postman?
- GitHub REST API Tutorial - Obsługa REST API w GitHub
- Jak używać programu Postman do testowania różnych formatów API?
- Samouczek POSTMAN: Testowanie API przy użyciu POSTMAN
- 31 najpopularniejszych pytań do wywiadów z Python Flask z odpowiedziami