flask api tutorial with example extending flask with apis
이 Flask API 자습서에서는 Flask twitter Oembedder, Flask API 및 Flask RESTful과 같은 인기있는 Flask 확장을 예제와 함께 설명합니다.
Flask 프레임 워크에는 상당히 많은 확장 기능이 있습니다. 이러한 확장은 매우 유용하고 개발하기 쉽습니다. 우리는 Flask 프레임 워크가 매우 Pythonic이고 최소한의 API 세트를 가지고 있으며 매우 유연하다는 것을 알고 있습니다. 이것이 바로 Flask 커뮤니티가 많은 특정 작업을위한 많은 확장을 만든 이유입니다.
Flask 자습서 시리즈의 일부로이 자습서에는 몇 가지 Flask 확장의 예가 있습니다. 다음 확장에 대해 설명합니다.
- 플라스크 트위터 Oembedder
- Flask API
- 플라스크 RESTful
이전 자습서의 일부로 많은 확장에 대해 논의했지만이 자습서에서는 Flask 확장의 구성 요소를 검토하는 관점에서 더 자세히 설명합니다.
학습 내용 :
플라스크 확장이란?
플라스크 확장은 설치 가능한 Python 모듈 또는 Flask 애플리케이션에 추가 기능을 구현하는 패키지입니다. Flask 확장은 Twitter와 같은 외부 API를 사용하여 웹 페이지에 트윗을 삽입하는 지원을 추가하는 것만 큼 간단 할 수 있습니다.
또는 Flask 확장은 아키텍처 패턴 또는 개발 패러다임을 따르는 앱을 빌드하기위한 Flask API 또는 Flask-RESTful과 같은 새로운 프레임 워크 일 수 있습니다.
플라스크 트위터 Oembedder
이 섹션에서는 기존 오픈 소스 단순 프로젝트의 예를 여기
이 프로젝트를 로컬 머신에 복제하고 아래에 언급 된 명령을 사용하여 pip를 사용하여 설치합니다.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
이 확장은 Jinja2 템플릿 태그의 도움으로 트윗을 삽입하는 데 도움이됩니다. 그러나이 확장 프로그램을 사용하려면 Twitter에서 개발자 계정을 신청해야합니다. 개발자 계정을 얻고 앱을 생성하면 Twitter API를 사용할 수있는 키와 비밀을 얻게됩니다.
CPU 및 GPU 온도를 모니터링하는 최고의 소프트웨어
키와 비밀을 확보 한 후에는 애플리케이션이 액세스 할 수 있도록 안전한 장소에 보관하십시오. 아래에 표시된 것처럼 환경 변수에 보관하고 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으로 저장됩니다.
구성 파일에 위의 줄을 추가 한 후 Flask 애플리케이션의 __init__.py로 이동하여 아래와 같이 수정하여 초기화합니다.
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 루프 앞에이 태그를 추가했습니다. 아주 긴 숫자가 트윗 ID입니다. 이 ID는 트윗 후 트윗 URL에서 가져옵니다. 템플릿 파일을 저장 한 후 아래 이미지와 같이 / hello / greetings 엔드 포인트로 이동하여 결과를받습니다.

플라스크 RESTful
Flask RESTful 예제 애플리케이션은 REST 아키텍처의 제약 조건을 준수하는 애플리케이션입니다. 그러나 그것은 프로토콜과 같지 않으며 개발자는 REST 제약 조건에 따라 기능을 구현하는 동안 유연합니다.
REST 아키텍처의 제약에 대해 자세히 읽어보십시오. 여기 .
최신 웹 애플리케이션을 통해 클라이언트는 읽기 쉽고 안정적인 엔드 포인트에서 상태 비 저장 방식으로 리소스를 요청할 수 있습니다.
Flask RESTful 예제
Flask RESTful 예제 애플리케이션에서도 RESTful 방식으로 일부 기능을 구현해 보겠습니다.
앨범 및 노래와 관련된 데이터를 저장하고 제공하는 방법이 있습니다. Flask RESTful 확장을 사용하여 API를 구현해 보겠습니다.
먼저 아래 명령을 사용하여 Flask RESTful을 설치합니다.
pip install flask-restful
손쉬운 유지 관리 및 이해를 위해 앱 디렉터리 내에 api.py라는 파일을 만들고 그 안에 다음 코드 줄을 언급하겠습니다. 지금은 Flask Views와 유사한 API를 고려하세요.
클라이언트가 애플리케이션의 서버 엔드 포인트에 요청을 보낼 때 응답하는 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의 Resource 추상 클래스를 서브 클래 싱하여 Songs 및 Song이라는 두 개의 리소스를 만들었습니다. Songs라는 클래스에는 두 HTTP 동사에 해당하는 get 및 post 메서드가 두 개 있습니다. 각각 GET 및 POST.
Songs 리소스는 클라이언트가 요청할 때 등록 된 엔드 포인트에 모든 노래를 제공하고 데이터가 동일한 엔드 포인트에 게시되면 기존 노래 목록에 노래를 추가합니다.
마찬가지로 Song 클래스의 경우 get, delete, put 메소드를 사용하여 HTTP GET, DELETE 및 PUT이 구현됩니다. get 메소드는 요청 된 노래를 JSON으로 응답을 보내고 delete 메소드는 SONGS에서 노래를 제거하며 put 메소드는 SONGS의 기존 노래를 업데이트합니다.
이제 이러한 리소스를 app 폴더 아래의 __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도 의도 한대로 작동합니다. 우리가 만든이 Simple API의 버전 v1에 대한 몇 가지 테스트를 추가하겠습니다.
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
유사하게, 더 많은 커버리지를 위해 다른 방법에 대한 테스트를 작성할 수 있습니다.
주목해야 할 중요한 점은 추가 한 노래가 개발 서버가 실행되는 단일 프로세스의 일부로 유지된다는 것입니다. 이는 프로세스가 종료되는 즉시 모든 새 데이터가 손실됨을 의미합니다.
또한 API v1 버전을 만드는 작업은 중복 된 것처럼 보이며 양식 및보기를 사용하여 애플리케이션에 데이터를 저장하는 방식과 다릅니다.
json 파일을 실행하는 방법
일반적으로 RESTful API를 구현하려면 클라이언트에서 데이터를 가져오고, 클라이언트와 서버 끝을 마샬링하고, 우리가 만든 데이터베이스 모델을 사용한 지속성이 필요합니다.
또한 엔드 포인트는 의도하지 않은 입력에 대해 보호됩니다.
따라서 위에 제시된 예제는 HTTP 메서드를 사용하여 REST 아키텍처의 개념과 제약 조건을 학습하기위한 것임을 권장합니다. 이것은 일반적으로 생성되는 웹 서비스의 여러 방법 중 하나 일뿐입니다. 또한 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는 게시 된 API를 나열하고 사용해 볼 수있는 Swagger UI를 제공하는데도 도움이됩니다. config.py를 열고 아래 표시된 구성으로 업데이트하십시오.
FAB_API_SWAGGER_UI=True
이제 https : // localhost : 8080 / swaggerview / v1로 이동하면 아래와 같이 Swagger보기를 볼 수 있습니다.

이제 우리가 가지고있는 기존 데이터베이스 모델에 대한 API를 만들어 보겠습니다. Flask-Appbuilder의 ModelApi를 사용해야합니다.
다음 코드 줄로 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를 기반으로 클래스를 정의한 후 add_api 메서드를 사용하여 Flask-Appbuilder에 다시 등록해야합니다.
이제 이전과 같이 Swagger UI로 이동하면 아래 표시된 것과 유사한 API 참조가 표시됩니다.

Swagger보기에서 또는 이전과 같이 컬을 엔드 포인트로 전송하여 API를 사용해 볼 수 있습니다.
Flask 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) Flask로 REST API를 생성하려면 어떻게해야합니까?
대답: Flask 프레임 워크를 Flask-RESTful, Flask API, Flask RESTX, Connexion 등과 같은 다른 Flask 확장과 함께 사용하여 REST API 기반 웹 애플리케이션을 만들 수 있습니다. 대부분의 확장은 Flask 프레임 워크의 다른 내장 기능 및 기타 기존 ORM / 라이브러리와 함께 작동합니다.
Q # 2) REST API 예제 란 무엇입니까?
대답: 이 튜토리얼에서는 RESTFul API를 구현하는 예제 애플리케이션이 제공됩니다. Flask-RESTful은 샘플 애플리케이션을 만드는 데 사용되었습니다. 이 자습서의 Flask RESTful 예제 섹션을 읽어보세요.
Q # 3) RESTful API는 무엇입니까?
대답: 일반적으로 HTTP 요청을 사용하고 클라이언트와 서버 간의 통신을 허용하기 위해 GET, POST, PUT 등과 같은 HTTP 동사에 해당하는 백엔드 메서드가있는 응용 프로그래밍 인터페이스를 RESTful API라고합니다.
다른 이메일 제공 업체는 무엇입니까
이러한 애플리케이션은 REST 아키텍처 원칙 및 제약 조건을 따라 기능을 구현합니다.
결론
Flask-twitter-oembedder, Flask API 및 Flask-RESTful과 같은 세 가지 확장을 사용하여 Flask 확장의 개념을 다뤘습니다.
Flask-twitter-oembedder의 도움으로 Twitter API의 개념도 다루었습니다. 일반적으로 REST 아키텍처 원칙 및 제약 조건을 따르는 RESTful 웹 서비스 구현 아이디어도 포함했습니다.
다음 튜토리얼에서는 독자가 두 프레임 워크의 강점과 약점을 이해하는 데 도움이되도록 Django와 Flask 프레임 워크의 비교를 다룰 것입니다. 또한 특정 프로젝트 요구 사항에 따라 다른 프레임 워크에 대해 하나의 프레임 워크를 선택하는 데 도움이됩니다.
추천 도서
- API 테스트 자습서 : 초보자를위한 완벽한 가이드
- Rest API 튜토리얼 : REST API 아키텍처 및 제약
- Parasoft SOAtest 자습서 : 스크립트없는 API 테스트 도구
- Postman에서 API 문서를 만드는 방법은 무엇입니까?
- GitHub REST API 자습서-GitHub에서 REST API 지원
- 다른 API 형식을 테스트하기 위해 Postman을 사용하는 방법?
- POSTMAN 자습서 : POSTMAN을 사용한 API 테스트
- 답변이있는 인기있는 Python Flask 인터뷰 질문 31 가지