flask api tutorial with example extending flask with apis
このFlaskAPIチュートリアルでは、Flask twitter Oembedder、Flask API、FlaskRESTfulなどの一般的なFlask拡張機能について例を挙げて説明します。
Flaskフレームワークには、非常に多くの拡張機能があります。これらの拡張機能は非常に便利で、簡単に開発できます。 Flaskフレームワークは非常にPythonicであり、APIのセットが最小限であり、非常に柔軟性があることがわかっています。そのため、Flaskコミュニティは多くの特定のタスクに対して非常に多くの拡張機能を作成しています。
Flaskチュートリアルシリーズの一部として、このチュートリアルにはいくつかのFlask拡張機能の例があります。以下の拡張について説明します。
- Flask twitter Oembedder
- Flask API
- フラスコRESTful
=> フラスコを最初から学ぶには、こちらにアクセスしてください
以前のチュートリアルの一部として多くの拡張機能について説明しましたが、このチュートリアルでは、Flask拡張機能のコンポーネントを調べるという観点から詳しく説明します。
学習内容:
フラスコ拡張とは何ですか
フラスコ拡張は、インストール可能なPythonモジュール、またはFlaskアプリケーションに追加機能を実装するパッケージです。 Flask拡張機能は、Twitterなどの外部APIを使用してWebページにツイートを埋め込むサポートを追加する拡張機能と同じくらい単純なものにすることができます。
または、Flask拡張機能は、Flask APIやFlask-RESTfulなどの新しいフレームワークであり、アーキテクチャパターンや開発パラダイムに従うアプリを構築します。
Flask twitter Oembedder
このセクションでは、既存のオープンソースの単純なプロジェクトの例を取り上げます。 ここに
このプロジェクトをローカルマシンに複製し、以下のコマンドを使用してpipを使用してインストールします。
# in an activated virtual environment pip install -e flask_twitter_oembedder/
この拡張機能は、Jinja2テンプレートタグを使用してツイートを埋め込むのに役立ちます。ただし、この拡張機能を使用するには、Twitterで開発者アカウントを申請する必要があります。開発者アカウントを取得したら、アプリを作成します。TwitterのAPIを使用するためのキーとシークレットを取得します。
エラー時にqtpで次に再開
キーとシークレットを取得したら、アプリケーションがそれらにアクセスできるように、それらを安全な場所に保管します。以下に示すように、これらを環境変数に保持し、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アーキテクチャの制約についてもっと読む ここに 。
最新のWebアプリケーションを使用すると、クライアントはステートレスな方法で、読みやすく安定したエンドポイントでリソースを要求できます。
フラスコのRESTfulな例
Flask RESTfulサンプルアプリケーションでも、RESTfulな方法でいくつかの機能を実装しましょう。
アルバムや曲に関連するデータを保存して提供する方法があります。 FlaskRESTful拡張機能を使用してAPIを実装しましょう。
まず、以下のコマンドを使用してFlaskRESTfulをインストールします。
pip install flask-restful
メンテナンスと理解を容易にするために、appディレクトリ内にapi.pyというファイルを作成し、その中に次のコード行を記述します。今のところ、Flaskビューに似た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という2つのリソースを作成しました。 Songsと呼ばれるクラスには、2つのHTTP動詞に対応するgetとpostの2つのメソッドがあります。それぞれGETとPOST。
曲リソースは、クライアントが要求したときにすべての曲を登録済みエンドポイントに提供し、データが同じエンドポイントに投稿されたときに既存の曲のリストに曲を追加します。
同様に、Songクラスの場合、HTTP GET、DELETE、およびPUTは、メソッド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' } } }
次に、以下のコマンドを使用して曲を追加しましょう。
PCをクリーンアップするための最良のソフトウェア
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' } } }
同様に、HTTPDELETEとPUTは意図したとおりに機能します。作成したこのSimpleAPIのバージョン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を作成するタスクは冗長であるように思われ、フォームとビューを使用してアプリケーションにデータを保存する方法とは異なります。
通常、RESTful APIの実装には、クライアントからのデータの取得、クライアントとサーバーエンド間のマーシャリング、および作成したデータベースモデルを使用した永続化が必要です。
さらに、エンドポイントは、意図しない巧妙な入力に対して保護されています。
したがって、上記の例は、HTTPメソッドを使用してRESTアーキテクチャの概念と制約を学習するためだけのものにすることをお勧めします。これは、一般的にWebサービスが作成される多くの方法の1つにすぎないことを覚えておいてください。さらに、RESTアーキテクチャを実装する方法はたくさんあります。
JSONやHTTPだけでなく、他のプロトコルを使用して、RESTでさまざまなファイル形式やカスタムメソッドを使用する方法をさらに詳しく調べることをお勧めします。 1つの製品の使用法を垣間見るために、以下の例を示します。
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を一覧表示して試すためのSwaggerUIの提供にも役立ちます。 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は、DjangoRESTフレームワークと非常によく似たフレームワークです。 FlaskAPIドキュメントにアクセスできます ここに 。これは、Flaskフレームワークのドロップイン代替品です。
上記の例のいずれかを選択して、Flask RESTAPI駆動の機能をアプリケーションに実装できます。
それでは、ソースをコミットし、Gitを使用して変更をオリジンリポジトリに公開しましょう。ブランチ名を使用してオリジンにコミットし、プルリクエストを送信するとすぐに、プルリクエストチェックの一部として、Gitアクションの下で単体テストが自動的にトリガーされます。
ボトルRestPlus
Flask RestPlusは、Flaskを使用したRESTAPIの作成に役立つもう1つのFlask拡張機能です。このプロジェクトはFlask-RESTXと呼ばれる別の拡張機能に分岐されており、現在は維持されていません。
このプロジェクトには、APIを説明するためのデコレータの優れたコレクションがあり、Swaggerを使用してドキュメントを公開しています。このプロジェクトの詳細を確認できます ここに 。
よくある質問
Q#1)Flaskを使用してREST APIを作成するにはどうすればよいですか?
回答: FlaskフレームワークをFlask-RESTful、Flask API、Flask RESTX、Connexionなどの他のFlask拡張機能とともに使用して、RESTAPIベースのWebアプリケーションを作成できます。ほとんどの拡張機能は、Flaskフレームワークの他の組み込み機能および他の既存のORM /ライブラリと連携します。
Q#2)REST APIの例とは何ですか?
回答: このチュートリアルでは、RESTFulAPIを実装するアプリケーションの例を示します。 Flask-RESTfulは、サンプルアプリケーションの作成に使用されています。このチュートリアルのFlaskRESTfulサンプルセクションについてお読みください。
Q#3)RESTful APIとは何ですか?
回答: 一般にHTTPリクエストを使用し、クライアントとサーバー間の通信を可能にするGET、POST、PUTなどのHTTP動詞に対応するバックエンドメソッドを持つアプリケーションプログラミングインターフェイスは、RESTfulAPIと呼ばれます。
etlテストインタビューの質問と回答
このようなアプリケーションは、RESTアーキテクチャの原則と制約に従って、その機能を実装します。
結論
Flask-twitter-oembedder、Flask API、Flask-RESTfulなどの3つの拡張機能を使用して、Flask拡張機能の概念について説明しました。
Flask-twitter-oembedderの助けを借りて、TwitterAPIの概念についても説明しました。一般に、RESTアーキテクチャの原則と制約に従うRESTfulWebサービスを実装するというアイデアも含まれています。
次のチュートリアルでは、DjangoフレームワークとFlaskフレームワークの比較について説明し、読者が両方のフレームワークの長所と短所を理解できるようにします。また、特定のプロジェクト要件に基づいて、一方のフレームワークを他方に対して選択するのにも役立ちます。
=> ここでシンプルなフラスコトレーニングシリーズを探索する
推奨読書
- APIテストチュートリアル:初心者向けの完全ガイド
- Rest APIチュートリアル:RESTAPIアーキテクチャと制約
- Parasoft SOAtestチュートリアル:スクリプトレスAPIテストツール
- PostmanでAPIドキュメントを作成する方法は?
- GitHub RESTAPIチュートリアル-GitHubでのRESTAPIサポート
- さまざまなAPI形式をテストするためにPostmanを使用する方法は?
- POSTMANチュートリアル:POSTMANを使用したAPIテスト
- 回答付きの人気のあるPythonフラスコインタビューの質問トップ31