
【最終回】FastAPIチュートリアル: toDoアプリを作ってみよう【WebAPI編】
2021.12.20
FastAPIチュートリアル: toDoアプリを作ってみよう~最終回~
前回の記事「【第6回】FastAPIチュートリアル: toDoアプリを作ってみよう【予定の追加・削除編】」の続きです。
今回も、toDo アプリを作る過程で、FastAPI の使い方を学んでいきましょう!
第1回はこちら
「WebAPI」化を目指します!
こちらの連載は、今回の第7回をもって「最終回」となります。
最終回では、FastAPI の本命と言っても良い「WebAPI」化を目指します。
第1回でも言ったように、FastAPI は「対ユーザ」のアプリケーションは実は不向きで、本命は「対プログラム」の WebAPI を作成するためのライブラリです。
つまり、本連載で作成する toDoアプリケーションは、GUI・CUI ( CLI ) 両方で機能する toDoアプリにしていきます。
前者はもう実装終わりましたので、最終回は後者を実装していきたいと思います!
ログインユーザのタスクを全てJSON形式で取得する
まずは、最も単純な API です。
API はそもそも、他のプログラムから呼び出されることが前提ですので、扱いやすい形でレスポンスする必要があります。
よく扱われるのは、JSON (JavaScript Object Notation) 形式です。
ルーティング
ルーティングは、ずっとやってきたことと同じです。
1 2 3 4 5 6 7 8 9 10 11 | # FastAPIのルーティング用関数 app.add_api_route('/', index) app.add_api_route('/admin', admin, methods=['GET', 'POST']) app.add_api_route('/register', register, methods=['GET', 'POST']) app.add_api_route('/todo/{username}/{year}/{month}/{day}', detail) app.add_api_route('/done', done, methods=['POST']) app.add_api_route('/add', add, methods=['POST']) app.add_api_route('/delete/{t_id}', delete) # JSONで返すAPI app.add_api_route('/get', get) # new |
コントローラを書く
こちらも、さほど難しくはないと思います。
やることは、GUIでやってきたこととほとんど同じで、 return の仕方が異なるだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | def get(request: Request, credentials: HTTPBasicCredentials = Depends(security)): # 認証 username = auth(credentials) # ユーザ情報を取得 user = db.session.query(User).filter(User.username == username).first() # タスクを取得 task = db.session.query(Task).filter(Task.user_id == user.id).all() db.session.close() # JSONフォーマット task = [{ 'id': t.id, 'content': t.content, 'deadline': t.deadline.strftime('%Y-%m-%d %H:%M:%S'), 'published': t.date.strftime('%Y-%m-%d %H:%M:%S'), 'done': t.done, } for t in task] return task |
実際に確認してみる
FastAPIでは、APIのレスポンスを確認するのは簡単です。
これが、FastAPI の最大のメリットかもしれません。
サーバを立ち上げたら、http://127.0.0.1:8000/docs にアクセスしましょう。
すると「今まで書いてきた URL 」と「そのコントローラ」がずらっと確認できます。

toDoアプリのドキュメントが自動生成される
その中から今作成した、「get」を探しましょう。
そして、「Try out」から「Execute」をすると、

JSON形式のタスクを取得できる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [ { "id": 1, "content": "〇〇の締め切り", "deadline": "2019-12-25 12:00:00", "published": "2019-10-08 17:43:31", "done": false }, { "id": 2, "content": "太郎とランチ", "deadline": "2019-10-21 12:00:00", "published": "2019-10-19 22:17:18", "done": true }, { "id": 3, "content": "□□□へ振り込み", "deadline": "2019-11-01 16:00:00", "published": "2019-10-21 17:12:06", "done": false } ] |
うまく動作していそうですね。
実際は、ベーシック認証を挟むので、コンソールから取得する場合は
1 | $ curl -u username:password http://127.0.0.1:8000/get |
のようにユーザ名とパスワードが必要です。
ちなみに、引数の request: Request はなくても良いです。
POSTメソッドを伴うAPI
次に、コマンドラインからタスクを追加し、新しく追加したタスクをJSONで返すようなAPIを作成します。
ここでは、POSTメソッドとしてデータが送信された時を考えます。
したがって、ルーティングは以下のようになります。(関数名は適当に決めます)
1 2 3 | # JSONで返すAPI app.add_api_route('/get', get) app.add_api_route('/add_task', insert, methods=['POST']) # new |
コントローラを書く
コントローラを書いていきますが、GUI と同じような POST メソッドの受け取りかたは使わず、ドキュメントに反映されるように FastAPI の Form() 関数を使います。
まずは、新たにインポートしてください。
1 | from fastapi import FastAPI, Depends, Form |
Form()を使ったPOSTメソッドの受け取りかたは、以下のように書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | async def insert(request: Request, content: str = Form(...), deadline: str = Form(...), credentials: HTTPBasicCredentials = Depends(security)): """ タスクを追加してJSONで新規タスクを返す。「deadline」は%Y-%m-%d_%H:%M:%S (e.g. 2019-11-03_12:30:00)の形式 """ # 認証 username = auth(credentials) # ユーザ情報を取得 user = db.session.query(User).filter(User.username == username).first() # タスクを追加 task = Task(user.id, content, datetime.strptime(deadline, '%Y-%m-%d_%H:%M:%S')) db.session.add(task) db.session.commit() # テーブルから新しく追加したタスクを取得する task = db.session.query(Task).all()[-1] db.session.close() # 新規タスクをJSONで返す return { 'id': task.id, 'content': task.content, 'deadline': task.deadline.strftime('%Y-%m-%d %H:%M:%S'), 'published': task.date.strftime('%Y-%m-%d %H:%M:%S'), 'done': task.done, } |
POSTメソッドを受け取るときは、 async を忘れずに!
動作確認
先ほどと同じように、ドキュメントを見てみましょう!

フォームをドキュメントから指定できるようになった
このようにドキュメントに必要なデータフォームが表示されるようになりました。
では、実際に動かしてみましょう!

POSTメソッドがしっかり動作していそうです!
1 2 3 4 5 6 7 | { "id": 6, "content": "Hogehoge", "deadline": "2019-12-24 12:00:00", "published": "2019-10-21 19:10:16", "done": false } |
うまく動作していそうです!
これで外部からタスクの追加ができるようになり、WebAPIとして動作するようになりました。
他にも、API化すべき機能がありますが、どれも同じような解説になるので、ここまでにしておきたいと思います!
ReDocの確認
最後に、FastAPI で自動生成される ReDoc について確認の仕方を解説して連載を終わりにしたいと思います。
といっても簡単で、http://127.0.0.1:8000/redoc にアクセスするだけです。

ReDocの確認
このように静的なドキュメントが自動生成されます。
やはり、FastAPIは、「API 作成に強い API 」ということが分かりますね。
さいごに
これにて、「FastAPIチュートリアル: toDoアプリを作ってみよう」の連載は終了です!
本連載を通して、FastAPI の使い方や、Webアプリケーションの作り方を理解できたかと思います。
FastAPI は、まだ発展途上のライブラリですので、これからのアップデートに期待できそうです。
それでは、第7回にわたりご愛読していただきありがとうございました!
Responderはオススメ
他にも、Responder など様々なWebライブラリがありますので、ぜひ他のものも触れてみてください!
特に、Responderはオススメです!
本連載で作成したコード
本連載で作成したコードは、Githubにアップロードしてありますので、ご自由にお使い下さい!
書いた人はこんな人

- 「好きを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。
システム開発依頼・お見積もり大歓迎!
また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。
以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit
ライトコードの日常12月 1, 2023ライトコードクエスト〜東京オフィス歴史編〜
ITエンタメ10月 13, 2023Netflixの成功はレコメンドエンジン?
ライトコードの日常8月 30, 2023退職者の最終出社日に密着してみた!
ITエンタメ8月 3, 2023世界初の量産型ポータブルコンピュータを開発したのに倒産!?アダム・オズボーン