flask api tutorial with example extending flask with apis
Цей підручник з Flask API пояснює такі популярні розширення Flask, як Flask twitter Oembedder, Flask API та Flask RESTful, з прикладами:
Фреймворк має досить велику кількість розширень. Ці розширення досить корисні і їх легко розробити. Ми знаємо, що фреймворк Flask дуже пітонічний і має мінімальний набір API, і дуже гнучкий, саме тому спільнота Flask створила стільки розширень для багатьох конкретних завдань.
Як частина серії підручників Flask, цей посібник має приклад кількох розширень Flask. Ми обговоримо наступні розширення.
- Колба щебетати Oembedder
- API колби
- Фляжка RESTful
=> Завітайте сюди, щоб вивчити колбу з нуля
Хоча ми обговорювали багато розширень як частину наших попередніх підручників, цей посібник пояснює більше з точки зору вивчення компонентів розширення Flask.
Що ви дізнаєтесь:
Що таке розширення колби
Розширення flask - це інстальований модуль Python або пакет, який реалізує додаткові функціональні можливості програми Flask. Розширення Flask може бути таким самим простим, як і те, що додає підтримку споживання зовнішнього API, такого як Twitter, для вбудування твіту на веб-сторінці.
Або розширення Flask може бути новим фреймворком, таким як API Flask або Flask-RESTful для створення додатків, які відповідають архітектурному зразку або парадигмі розвитку.
Колба щебетати Oembedder
У цьому розділі ми беремо приклад існуючого простого проекту з відкритим кодом тут
Клонуйте цей проект на локальній машині та встановіть його за допомогою pip за допомогою згаданої команди.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Це розширення допомагає вбудовувати твіт за допомогою тегу шаблону Jinja2. Однак, щоб використовувати це розширення, вам доведеться подати заявку на обліковий запис розробника в Twitter. Отримавши обліковий запис розробника, створіть програму, і ви отримаєте ключі та секрети для використання API Twitter.
запитання та відповіді для інтерв’ю на етапі обробки даних
Отримавши ключі та секрети, зберігайте їх у безпечному місці, щоб програма могла отримати до них доступ. Ми зберегли їх у змінних середовища та додали до конфігурації програми Flask, як показано нижче. Наш демонстраційний додаток зберігає значення конфігурації у файлі 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)
Ми отримуємо значення необхідних змінних із змінних середовища. Якщо відповідне значення відсутнє у змінній середовища, тоді воно зберігається як None.
Додавши вищезазначені рядки у конфігураційний файл, перейдіть до програми __init__.py програми Flask та ініціалізуйте її, змінивши, як показано нижче.
from flask_caching import Cache from flask_twitter_oembedder import TwitterOEmbedder cache = Cache(app, config={'CACHE_TYPE': 'simple'}) twitter_oembedder = TwitterOEmbedder(app, cache)
Ці рядки ініціалізують розширення Flask. Тепер ми можемо змінити hello.html під шаблонами та додати згаданий тег, як показано нижче.
{{ oembed_tweet('1277228221394587649') }}
Ми додали цей тег перед циклом for у існуючий шаблон. Ця дуже довга цифра - це ідентифікатор твіту. Ми отримуємо цей ідентифікатор із URL-адреси твіту після твітування. Після збереження файлу шаблону ми переходимо до кінцевої точки / hello / greetings і отримуємо результати, як показано на малюнку нижче.

Фляжка RESTful
Наш приклад програми RESTful Flask - це той, який дотримується обмежень архітектури REST. Однак це не схоже на протокол, і розробники гнучкі під час реалізації функцій, дотримуючись обмежень REST.
Будь ласка, прочитайте більше про обмеження архітектури REST тут .
Сучасні веб-додатки дозволяють клієнтам запитувати ресурси у зручних для читання та стабільних кінцевих точках способом без громадянства.
Приклад RESTful колби
Давайте реалізуємо деякі функції RESTful способом у нашому прикладі Flask RESTful.
У нас є спосіб зберігання та обслуговування даних, пов’язаних з альбомами та піснями. Давайте реалізуємо API за допомогою розширення Flask RESTful.
Спочатку встановіть Flask RESTful за допомогою наведеної нижче команди.
pip install flask-restful
Для зручності обслуговування та розуміння давайте створимо файл з назвою api.py всередині каталогу програми та згадаємо в ньому наступні рядки коду. На даний момент розглянемо API, подібні до Flask Views.
Ми збираємось реалізувати функції, що відповідають дієсловам HTTP, щоб відповісти, коли Клієнт надсилає запит до кінцевої точки Сервера програми.
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/')
Ми створили два ресурси під назвою 'Пісні' та 'Пісня', підкласувавши абстрактний клас 'Ресурс' Flask-RESTful. Клас під назвою 'Пісні' має два методи get і post, що відповідають двом дієсловам HTTP; GET і POST, відповідно.
Ресурс 'Пісні' обслуговує всі пісні до зареєстрованої кінцевої точки, коли Клієнт цього вимагає, і додає пісню до списку існуючих пісень, коли дані розміщуються в тій самій кінцевій точці.
Подібним чином, у випадку класу Song, HTTP GET, DELETE і PUT реалізовані за допомогою методів get, delete і put. Метод get відправляє відповідь із запитаною піснею як JSON, метод delete видаляє пісню з SONGS, а метод put оновлює існуючу пісню в SONGS.
Тепер давайте додамо ці ресурси до нашого зразка програми, ініціалізувавши їх у файлі __init__.py у папці програми.
from . import api
Давайте встановимо curl і спробуємо функції на зазначених кінцевих точках.
sudo apt -y install curl
Отримати всі пісні
curl -k https://localhost:8080/api/v1/songs
Ми отримуємо відповідь, як показано нижче.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
Тепер давайте використаємо згадану нижче команду, щоб додати пісню.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Ми отримуємо відповідь від нашого API, як показано нижче.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
Знову ж таки, якщо ми запитаємо список пісень, як це було зроблено в попередній команді, і ми отримаємо обидві пісні у відповіді.
що краще java або c ++
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' }, 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } } }
Подібним чином HTTP DELETE та PUT працюють за призначенням. Давайте додамо кілька тестів для версії v1 цього простого API, який ми створили.
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
Тепер запустіть ці тести з командного рядка, як показано нижче.
pytest app/tests/test_api.py
Подібним чином, ми можемо написати тести на інші методи для більшого охоплення.
Важливо відзначити, що додані нами пісні зберігаються як частина єдиного процесу, під яким працює сервер розробки. Це означає, що всі нові дані будуть втрачені, як тільки процес вимкнеться.
Більше того, завдання створення версії v1 API здається зайвим, і воно відрізняється від способу збереження даних у програмі за допомогою форм та подань.
Зазвичай реалізація RESTful API вимагає отримання даних від клієнтів, проведення маршінгу між кінцями клієнта та сервера та наполегливість за допомогою створених нами моделей баз даних.
Більше того, кінцеві точки захищені від ненавмисних та створених входів.
Тому ми рекомендуємо, щоб наведені вище приклади були лише для вивчення концепцій та обмежень архітектури REST за допомогою методів HTTP. Пам'ятайте, що це лише один із багатьох способів створення веб-служб, загалом. Більше того, існує безліч способів реалізації архітектури REST.
Ми закликаємо читачів вивчити далі, як REST може мати різні формати файлів та власні методи, використовуючи інші протоколи, а не тільки JSON та HTTP. Лише для того, щоб побачити одне виробниче використання, ми наводимо приклад нижче.
Ми використовуємо Flask-Appbuilder BaseApi для реалізації подібних функцій під різними кінцевими точками. Відкрийте файл api.py та оновіть його за допомогою згаданого нижче коду.
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)
Тепер додамо ще кілька тестів для перевірки кінцевих точок, побудованих за допомогою Flask-Appbuilder. Ми проведемо ці тести за допомогою 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 також допомагає в наданні інтерфейсу Swagger для переліку та випробування опублікованого API. Відкрийте config.py та оновіть його за допомогою конфігурації, показаної нижче.
FAB_API_SWAGGER_UI=True
Тепер перейдіть до https: // localhost: 8080 / swaggerview / v1, і ви зможете побачити вигляд Swagger, як показано нижче.

Тепер давайте створимо API для існуючих моделей баз даних, які ми маємо. Нам потрібно використовувати ModelApi Flask-Appbuilder.
Оновіть файл api.py наступними рядками коду.
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)
Після визначення класу на основі ModelRestApi нам знову потрібно зареєструвати його у Flask-Appbuilder, використовуючи метод add_api.
Тепер перейдіть до інтерфейсу Swagger, як і раніше, і ви побачите посилання на API, подібне до наведеного нижче.

Ви можете спробувати API у поданні Swagger або надіславши завиток до кінцевих точок, як раніше.
API колби
Flask API - це фреймворк, який дуже схожий на фреймворк Django REST. Ви можете отримати доступ до документації Flask API тут . Це випадаюча заміна рамки Flask.
Ми можемо вибрати будь-який із наведених вище прикладів, щоб реалізувати функції Flask REST API в нашому додатку.
Тепер давайте зафіксуємо джерело та опублікуємо зміни до репозиторію джерела за допомогою Git. Як тільки ми беремо на себе джерело з назвою гілки і надсилаємо запит на витягування, модульні тести автоматично запускатимуться під дією Git як частина перевірки запиту на витягування.
Колба RestPlus
Flask RestPlus - ще одне розширення Flask, яке допомагає у створенні REST API за допомогою Flask. Цей проект було розгалужено до іншого розширення під назвою Flask-RESTX і більше не підтримується.
Цей проект має гарну колекцію декораторів для опису API та виставляє свою документацію за допомогою Swagger. Ви можете перевірити деталі цього проекту тут .
Часті запитання
Q # 1) Як мені створити REST API за допомогою Flask?
Відповідь: Ми можемо використовувати фреймворк Flask з іншими розширеннями Flask, такими як Flask-RESTful, Flask API, Flask RESTX, Connexion тощо для створення веб-додатків на основі REST API. Більшість розширень працюють з іншими вбудованими функціями фреймворку Flask та будь-якими іншими існуючими ORM / бібліотеками.
Q # 2) Що таке приклад REST API?
Відповідь: Приклад програми, що реалізує RESTFul API, наведено в цьому посібнику. Flask-RESTful був використаний для створення зразка програми. Прочитайте про приклад Flask RESTful в цьому посібнику.
Q # 3) Для чого призначений RESTful API?
Відповідь: Інтерфейс прикладного програмування, який зазвичай використовує HTTP-запити та має відповідні бекенд-методи для HTTP-дієслів, таких як GET, POST, PUT тощо, щоб дозволити зв'язок між клієнтом та сервером, називається RESTful API.
c # питання співбесіди для досвідчених
Такий додаток відповідає принципам та обмеженням архітектури REST для реалізації його особливостей.
Висновок
Ми розглянули поняття розширень Flask за допомогою трьох розширень, таких як Flask-twitter-oembedder, Flask API та Flask-RESTful.
За допомогою Flask-twitter-oembedder ми також розглянули поняття Twitter API. Загалом, ми також включили ідеї впровадження веб-служби RESTful, яка відповідає принципам та обмеженням архітектури REST.
У нашому наступному підручнику ми розглянемо порівняння між Django та Flask, щоб допомогти нашим читачам зрозуміти сильні та слабкі сторони обох фреймворків. Це також допоможе у виборі однієї основи проти іншої на основі конкретних вимог проекту.
=> Ознайомтесь із простими циклами навчальних колб тут
Рекомендована література
- Підручник з тестування API: повний посібник для початківців
- Підручник з API для відпочинку: Архітектура та обмеження API REST
- Підручник з Parasoft SOAtest: інструмент тестування API без скриптів
- Як створити документацію API у поштарці?
- GitHub REST API Tutorial - Підтримка API REST в GitHub
- Як використовувати листоношу для тестування різних форматів API?
- Підручник з POSTMAN: Тестування API за допомогою POSTMAN
- Найпопулярніші 31 Популярне запитання для інтерв’ю на Python Flask із відповідями