flask api tutorial with example extending flask with apis
Този урок за Flask API обяснява популярни разширения на Flask като Flask twitter Oembedder, Flask API и Flask RESTful с примери:
Рамката Flask има доста голям брой разширения. Тези разширения са доста полезни и са лесни за разработване. Знаем, че рамката Flask е много питонична и има минимален набор от API и е много гъвкава, поради което общността Flask е създала толкова много разширения за много специфични задачи.
Като част от поредицата Flask tutorial, този урок има пример за няколко разширения на Flask. Ще обсъдим следните разширения.
- Колба в Twitter Oembedder
- API на колбата
- Колба RESTful
=> Посетете тук, за да научите колбата от нулата
Въпреки че обсъдихме много разширения като част от предишните ни уроци, този урок обяснява повече с перспективата за изследване на компонентите на разширение на Flask.
Какво ще научите:
Какво е удължаване на колба
Разширението на колбата е инсталируем модул на Python или пакет, който прилага допълнителна функционалност към приложение на Flask. Разширението на Flask може да бъде толкова просто, колкото това, което добавя поддръжка за консумиране на външен API като Twitter, за да вградите туит в уеб страница.
Или разширението на Flask може да е нова рамка като Flask API или Flask-RESTful за изграждане на приложения, които следват архитектурен модел или парадигма на разработката.
Колба в Twitter Oembedder
В този раздел вземаме примера на съществуващ прост проект с отворен код от тук
Клонирайте този проект във вашата локална машина и го инсталирайте с помощта на pip с помощта на посочената по-долу команда.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Това разширение помага при вграждането на туит с помощта на таг на шаблон Jinja2. За да използвате това разширение, ще трябва да кандидатствате за акаунт на програмист в Twitter. След като получите акаунт на програмист, създайте приложение и ще получите ключове и тайни за използване на API на Twitter.
как се отварят xml файлове
След като разполагате с ключовете и тайните, съхранявайте ги на сигурно място, така че приложението да има достъп до тях. Запазихме тези в променливите на средата и добавихме към конфигурацията на приложението 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 адреса на Twitter след туитване. След като запазим файла на шаблона, ние се придвижваме до крайната точка / hello / greetings и получаваме резултатите, както е показано на изображението по-долу.

Колба RESTful
Нашето Flask RESTful примерно приложение е това, което зачита ограниченията на REST архитектурата. Това обаче не е като протокол и разработчиците са гъвкави, докато прилагат функции, следвайки ограниченията REST.
Моля, прочетете повече за ограниченията на REST архитектурата тук .
Съвременните уеб приложения позволяват на клиентите да изискват ресурсите при лесни за четене и стабилни крайни точки по начин без гражданство.
Flask RESTful Пример
Нека да внедрим някои функции по RESTful начин и в нашето примерно приложение Flask RESTful.
Имаме начин да съхраняваме и обслужваме данни, свързани с албуми и песни. Нека да приложим API, използвайки разширението Flask RESTful.
безплатен софтуер за видео конвертор за Windows
Първо инсталирайте 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/')
Създадохме два ресурса, наречени Songs и Song, като подкласирахме абстрактния клас Resource на Flask-RESTful. Класът, наречен Songs, има два метода get и post, съответстващи на двата HTTP глагола; GET и POST, съответно.
Ресурсът Songs обслужва всички песни към регистрираната крайна точка, когато клиентът го поиска и добавя песен към списъка със съществуващи песни, когато данните се публикуват в същата крайна точка.
По подобен начин, в случай на клас 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' } }
Сега отново, ако потърсим списъка с песни, както направихме в предишната команда, и ще получим и двете песни в отговор.
{ '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 framework.
Можем да изберем някой от горепосочените примери, за да приложим функциите, управлявани от Flask REST API в нашето приложение.
Сега нека ангажираме източника и публикуваме промените в репото за произход, използвайки Git. Веднага след като се ангажираме с произхода с името на клона и изпратим заявка за изтегляне, модулните тестове автоматично ще се задействат под действията на Git като част от проверките за заявка за изтегляне.
Колба RestPlus
Flask RestPlus е още едно разширение на Flask, което помага при създаването на REST API с помощта на Flask. Този проект е раздвоен в друго разширение, наречено Flask-RESTX, и вече не се поддържа.
Този проект има добра колекция от декоратори, за да опише API-та и излага своята документация с помощта на Swagger. Можете да проверите подробностите за този проект тук .
често задавани въпроси
В # 1) Как да създам REST API с Flask?
Отговор: Можем да използваме рамката на Flask с други разширения на Flask като Flask-RESTful, Flask API, Flask RESTX, Connexion и др., За да създадем REST API базирани уеб приложения. Повечето разширения работят с другите вградени функции на Flask framework и всички други съществуващи ORM / библиотеки.
В # 2) Какво е пример за REST API?
Отговор: Примерно приложение, което прилага RESTFul API е дадено в този урок. Flask-RESTful е използван за създаване на примерното приложение. Прочетете за раздела Flask RESTful пример в този урок.
В # 3) За какво е RESTful API?
Отговор: Интерфейс за приложно програмиране, който обикновено използва HTTP заявки и има съответни бекенд методи за HTTP глаголи като GET, POST, PUT и др., За да позволи комуникация между клиент и сървър, се нарича RESTful API.
най-добрият софтуер за клониране на HDD към SSD
Такова приложение следва REST архитектурните принципи и ограничения, за да приложи своите характеристики.
Заключение
Ние разгледахме концепциите на разширенията на Flask с помощта на три разширения, като Flask-twitter-oembedder, Flask API и Flask-RESTful.
С помощта на Flask-twitter-oembedder покрихме и концепциите на Twitter API. Като цяло включихме и идеите за внедряване на уеб услуга RESTful, която следва принципите и ограниченията на REST архитектурата.
В следващия урок ще разгледаме сравнението между Django и Flask framework, за да помогнем на нашите читатели да разберат силните и слабите страни на двете рамки. Това също ще помогне при избора на една рамка спрямо другата въз основа на конкретните изисквания на проекта.
=> Разгледайте тук поредицата за обучение на Simple Flask
Препоръчително четене
- Урок за API тестване: Пълно ръководство за начинаещи
- Урок за API за почивка: REST API архитектура и ограничения
- Урок за Parasoft SOAtest: Инструмент за тестване на API без скриптове
- Как да създам API документация в пощальон?
- Урок за GitHub REST API - Поддръжка на REST API в GitHub
- Как да използвам пощальон за тестване на различни формати на API?
- Урок за POSTMAN: Тестване на API с помощта на POSTMAN
- Топ 31 популярни въпроса за интервю с Python Flask с отговори