
ResponderとFastAPIを実際に使って比較してみた
2020.08.21
ResponderとFastAPIを比較したい!
Webアプリケーションといえば、PHPの「CakePHP」、Pythonの「Django」、Rubyの「Rails」などが有名ですね。
そんな中、最近注目されてきているWebフレームワークがあります。
本ブログでも、使い方の例を紹介している『 Responder 』と『 FastAPI 』。
今回は、この2つのフレームワークを実際に使ってみて、気づいたことをまとめて比較してみようと思います。
少し主観が入る部分がありますが、ご了承ください。
ResponderとFastAPIの連載記事はこちら
こちらの記事もオススメ!
ResponderとFastAPIの共通部分について
まずは、今回比較する2つのフレームワークについて、簡単にご紹介したいと思います。
実は、この2つのフレームワークは共通している部分がいくつかあります。
Starletteベース
Responder と FastAPI は、Starlette (スターレット: フランス語で”小さな星”) がバックで動作しています。
つまり、どちらのフレームワークも Starlette をラップしたフレームワークということです。
Starlette は、あまり日本では流行っていませんが、このフレームワークは様々な機能が詰め込まれており、拡張性に長けています。
Responder と FastAPI を使う場合は、Starlette の機能も使おうと思えば使用可能です。
また、Starlette におけるサーバーの起動は、Uvicorn と呼ばれるフレームワークを扱っているので、これは Responder と FastAPI においても同様となっています。
ただし、注意点として、Responder と FastAPIでは扱うStarletteのバージョンが異なります。
【Starlette 公式サイト】
https://www.starlette.io/
Jinja2テンプレートエンジン
これも Starlette が Jinja2 をサポートしているので当たり前なのですが、HTML生成にはResponder と FastAPI においても、Jinja2テンプレートエンジンが使用できます。
ただし、詳細は後述しますが、Responder の方が扱いやすくラップされている一方で、FastAPI では、直接 Starlette を経由して扱うことになります。
非同期処理に強い
Responder も FastAPI も、非同期処理を簡単に実装することができます。
Responder
特に、Responder では、 @api.background.task デコレータを関数につけるだけでOKなのは便利ですね。
FastAPI
FastAPI では、 from fastapi import BackgroundTasks したのち、引数で以下のように指定してあげることで、バックグラウンドタスクとして実行が可能です。
1 2 3 | def index(request: Request, bg_task: BackgroundTasks): # バックグラウンドタスクとして追加 bg_task.add_task(Something) |
ただし、非同期処理と言っていますが、バックグラウンドで実行されたタスクから、終了のレスポンスは直接受け取ることができないので注意が必要です。
MVCアプリケーションを作成する場合

MVCアプリケーションの概要(このモデルはMVC2とも呼ばれる)
まずはビューを持つ、一般的なWebアプリケーション(MVC: Model View Controller)について見ていきましょう。
MVCに強いResponder
Responderは、対ユーザーのMVCアプリケーションを作成するのに特化しています。
Responderでは基本的に、インポートするのは import responder のみで済み、比較的コードが乱雑になることなくアプリケーションを構築できます。
先ほどの Jinja テンプレートについても、 responder.API.jinja_env が Jinja2 の環境変数になっており、設定も容易です。
フィルタ
例えば、フィルタは以下のようのに追加できます。
1 2 3 4 5 6 7 8 9 10 11 | # ResponderのAPIインスタンス api = responder.API() # staticをjinja2で解決するためにstaticフィルタを定義 def static_filter(path): return '/static/' + path # staticをフィルタに追加 api.jinja_env.filters['static'] = static_filter |
テンプレートをビューに渡す
テンプレートをビューに渡す場合も、
1 2 3 4 | resp.content = api.template("index.html", arg1=arg1, arg2=arg2, ) |
のように、ResponderのAPIクラスにJinjaテンプレートが扱えるメソッドが用意されています。
ここで注目すべきなのは、Starletteが見えていないことです。
あくまで、プログラミングする側は「Repsponder」を扱っているだけなのです。
サーバーの起動
サーバーの起動も、裏で Responder がよろしく Uvicorn を起動してくれているので、
1 | api.run() |
だけでOKです。
MVCに弱いFastAPI
一方で、FastAPI はビューを持つアプリケーションには対応していません。
もし、先ほどの Responder と同じようなことをやろうとすると、
1 2 3 4 5 6 7 8 9 10 11 | from starlette.templating import Jinja2Templates # テンプレート関連の設定 (jinja2) templates = Jinja2Templates(directory="templates") jinja_env = templates.env # Jinja2.Environment : filterやglobalの設定用 def index(request: Request): # Jinja2のよるHTML生成 return templates.TemplateResponse('index.html', {'request': request}) |
のように、Starlette の機能を直接使わなければなりません。
サーバーの起動
また、サーバーの起動は、FastAPI の場合、Uvicorn を自分でインポートしなければなりません。
1 2 3 4 | import uvicorn # コンソールで [$ uvicorn run:app --reload]でも可 uvicorn.run(app=app) |
WebAPIを作成する場合
続いて、「WebAPI」と呼ばれる、対プログラムのアプリケーションを作成する場合について比較していきましょう。
WebAPI作成にもやや強いResponder
Responder は、もちろんWebAPIを作成するのにも向いています。
JSON/YMAL をレスポンスする場合
JSON/YMAL をレスポンスする場合は、
1 2 | resp.json = {'Hello': 'world'} resp.media = {'Responder': 'Python'} |
のように記述できます。
レスポンスのステータスコード
レスポンスのステータスコードも、
1 | resp.status_code = api.status_codes.HTTP_500 |
のように設定可能です。
WebAPIのドキュメント
WebAPI のドキュメントも
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import responder api = responder.API( title='Polls Application with Responder', version='1.0', openapi='3.0.2', docs_route='/docs', description='hogehoge', contact={ 'name': 'RightCode Inc. Support', 'url': 'https://rightcode.co.jp/contact', 'email': '****@abcdefg.com' } ) |
で自動である程度作成されます。
各URLに対応したドキュメントは、自動では生成してくれず、各メソッドに直接 Swagger を記述する必要があります。
WebAPI作成に強いFastAPI
一方、FastAPIはその名の通り、WebAPI を作成するのに特化しています。
JSON/YMALをレスポンスする場合
JSON/YMAL をレスポンスする場合は、辞書型変数を返すだけでOKです。
例えば、
1 2 3 4 5 6 7 | def hoge(request: Request): # returnでJSONで返す return { 'id': '1', 'username': 'John Doe', 'Age': 20, } |
のような感じです。
認証やPOSTデータの受け取り
また、認証やPOSTデータの受け取りは、FastAPI でサポートされている、以下のメソッドを使用することができます。
1 2 3 4 5 | from fastapi import (FastAPI, Depends, # 認証系 Form) # フォームデータ受け取り from fastapi.security import (HTTPBasic, # Basic認証 HTTPBasicCredentials) |
Basic認証を行いたいURL では、引数を以下のように指定するだけです。
1 2 3 4 | def get(credentials: HTTPBasicCredentials = Depends(security)): # Basic認証で受け取った情報 username = credentials.username password = credentials.password |
フォームでデータ受け取る場合
フォームでデータ受け取る場合は、
1 2 | async def insert(request: Request, username: str = Form(...), password: str = Form(...)): |
のように引数を指定してあげることで可能になります。
自動生成
また、これらの記法によってコードを記述することによって、各URL処理の Swaggerドキュメントを自動で全て生成されます。
ドキュメントは「 /docs 」

Swaggerドキュメントの例
静的なReDocは「 /redoc 」

ReDocの例
で確認することができます。
これが、FastAPIの大きな強みと言えます。
まとめ
まとめると、以下のようになります。
- ビューを持つアプリケーションやAPIを作るのなら Responder
- 高速なレスポンスを期待するAPIに特化したアプリケーションなら FastAPI
今回比べた2つのフレームワークは似ていますが、「何をターゲットとしているか」は異なります。
正直、裏で動いている Starlette の守備範囲が広いので、Responder にできることは FastAPI にもできますし、逆も然りです。
しかし、重要なのは、何を作ろうとしているのかです。
他のブログでも、Responder と FastAPI についての記事をいくつか掲載しているので、どのようなモノが作れるのか、是非読んでみてくださいね!
(株)ライトコードは、WEB・アプリ・ゲーム開発に強い、「好きを仕事にするエンジニア集団」です。
ResponderやFastAPIでのシステム開発依頼・お見積もりはこちらまでお願いします。
また、ResponderやFastAPIが得意なエンジニアを積極採用中です!詳しくはこちらをご覧ください。
※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。
こちらの記事もオススメ!
ResponderとFastAPIの連載記事はこちら
ライトコードよりお知らせ






一緒に働いてくれる仲間を募集しております!
ライトコードでは、仲間を募集しております!
当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。
また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!
なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。
ライトコードでは一緒に働いていただける方を募集しております!
採用情報はこちら書いた人はこんな人

IT技術2021.04.16【第1回】Djangoで日記アプリを作ろう~環境構築編~
IT技術2021.03.2910月20日メジャーアップデート!「Node.js v15」の新機能とは?
IT技術2021.03.02TypeScriptの型を問題形式で学べる「type-challenges」とは?
IT技術2021.03.01シスコルータのコンフィグ作成をPythonで自動化してみた!