• トップ
  • ブログ一覧
  • 【第1回】FastAPIチュートリアル: ToDoアプリを作ってみよう【環境構築編】
  • 【第1回】FastAPIチュートリアル: ToDoアプリを作ってみよう【環境構築編】

    メディアチームメディアチーム
    2019.11.14

    IT技術

    FastAPIチュートリアル: toDoアプリを作ってみる

    FastAPI は、最近注目を集めている WebAPIフレームワークです。

    以下記事でも、ご紹介している Responder と似ているところもあります。

    しかし、FastAPI は、高速にレスポンス可能な WebAPI を構築することに優れています。

    featureImg2019.10.25【まとめ編】Responderを使ってDjangoチュートリアルをやってみたResponderを使ってDjangoチュートリアルをやってみた~まとめ~ライトコード社長も今、イチオシのWEBフレー...

    今回作るもの

    しかし、今回、FastAPIを使って作るのは、プログラムを対象としたAPIではなくユーザ(人)を対象とした、いわゆる「MVCアプリケーション(サービス)」です。

    MVCの概略図 (このような形はMVC2とも呼ばれる)

    (Flaskでは、MVT: Model View Template と呼ばれますが、ほとんど同じです。)

    もちろん、FastAPIを作るからには、API的要素も加えてみます。

    この連載を通して学んでいただきたいこと

    1. FastAPIの使い方
    2. バックで動いているstarletteの使い方
    3. Webアプリケーションの作り方

    本記事からスタートする連載「FastAPIチュートリアル: ToDoアプリを作ってみる」では、シンプルなtoDoアプリ作成を通して、上記の3点を学んでいただきたいと考えています。

    環境構築

    それでは、お約束の環境構築から始めていきます!

    前提として、Pythonは3.6以上である必要はありますので、アップデートを予めしておいてください。

    FastAPIをインストール

    では、pipコマンドからFastAPIをインストールしましょう!

    1$ pip install fastapi

    このとき、SQLAlchemy Uvicorn が入っていなければ、ついでにインストールしてください。

    1$ pip install sqlalchemy uvicorn

    これで、FastAPI が使えるようになりました!

    注意

    FastAPI をインストールした後は、Responder が動作しなくなることがあります。(逆も然り)

    これは、どちらも裏で starlette と言うフレームワークが動いており、それぞれ動作するバージョンが異なるために生じます。

    もし動かなくなったら、もう一度使いたいフレームワークをインストールしなおしてみてください。

    プロジェクトを作成する

    では、プロジェクトディレクトリを作成していきます。

    特に名前はなんでも構いません。

    この記事では「fastAPI_Tutorial」にしています。

    Djangoとは違い、プロジェクト作成コマンドはなく、プロジェクトを1から全て構築していく必要があります

    これは大変な反面、無駄がなく、FastAPIの良い一面でもあります。

    必要なファイルを作成する

    次に、最低限必要なファイルコードを作成していきましょう。

    まずは、以下の3つのファイルを作成してください。

    1. run.py (サーバ立ち上げ用)
    2. urls.py (URLのルーティング用)
    3. controllers.py (レスポンス処理用)

    (名前はなんでもOKですが、分かりやすくこのような名前にしています。)

    controllers.py

    順番が逆になりますが、まずは、controllers.py に以下の内容を書きましょう。

    1from fastapi import FastAPI
    2from starlette.requests import Request
    3
    4app = FastAPI(
    5    title='FastAPIでつくるtoDoアプリケーション',
    6    description='FastAPIチュートリアル:FastAPI(とstarlette)でシンプルなtoDoアプリを作りましょう.',
    7    version='0.9 beta'
    8)
    9
    10
    11def index(request: Request):
    12    return {'Hello': 'World'}

    このファイルでは、FastAPIインスタンスを生成し、この後紹介するurls.pyでURLに紐づく関数を定義しています。

    今はまだ、簡単なJSONを返す処理になっていますが、いずれ変えていきたいと思います。

    urls.py

    ここでは、先ほども言ったように、URLを登録します。

    仮に、このように記述してみます。

    1from controllers import *
    2
    3
    4# FastAPIのルーティング用関数
    5app.add_api_route('/', index)

    これで、http://127.0.0.1:8000/にアクセスした時に、controllers.py のdef index() に処理が投げられるというわけです。

    ちなみに、app.add_api_route() は、FastAPIクラスのメンバ関数ですが、裏で動いているstarletteのルーティング関数app.add_route() でも良いです。

    run.py

    このファイルは、今後触ることはなく、単にサーバを立ち上げるだけの関数です。

    1from urls import app
    2import uvicorn
    3
    4if __name__ == '__main__':
    5    # コンソールで [$ uvicorn run:app --reload]でも可
    6    uvicorn.run(app=app)

    FastAPI のサーバ立ち上げは、Uvicorn というライブラリで立ち上げる必要があります。

    このとき、uvicorn.run(app=app, port=8888) のようにポートを変更することも可能です。

    サーバを立ち上げてみる

    では、以下のコマンドで run.py を実行し、サーバを立ち上げてみましょう。

    1$ python run.py

    すると、

    1INFO: Started server process [9912]
    2INFO: Waiting for application startup.
    3INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

    と表示されるはずです。

    確認

    http://127.0.0.1:8000 にアクセスしてみましょう!

    1{"Hello":"World"}

    と表示されれば、FastAPI は正しく動作しています。

    ちなみに、http://127.0.0.1:8000/docsにアクセスすると、自動でAPIドキュメントが生成されます。(これは便利!)

    テンプレートエンジンを使う

    今のままでは、素の文字列が表示されるだけのつまらないアプリです。

    そこで、Jinja2 のテンプレートエンジンを使って、もう少しマシなビューを作りましょう。

    Jinja2(ジンジャツー)
    渡された変数を元に動的にページを生成するツールです。

    これは、裏で動いているstarletteにインポートされています

    controllers.pyに加筆

    まずは、テンプレートを使うために、controllers.py に必要事項を加筆します。

    1from fastapi import FastAPI
    2from starlette.templating import Jinja2Templates  # new
    3from starlette.requests import Request
    4
    5
    6app = FastAPI(
    7    title='FastAPIでつくるtoDoアプリケーション',
    8    description='FastAPIチュートリアル:FastAPI(とstarlette)でシンプルなtoDoアプリを作りましょう.',
    9    version='0.9 beta'
    10)
    11
    12
    13# new テンプレート関連の設定 (jinja2)
    14templates = Jinja2Templates(directory="templates")
    15jinja_env = templates.env  # Jinja2.Environment : filterやglobalの設定用
    16
    17
    18def index(request: Request):
    19    return templates.TemplateResponse('index.html',
    20                                      {'request': request}  # new 変更!

    これで、URL「/」でtemplates/index.htmlをレスポンスするようになりました。

    これ以降、ビューは全て「templates」ディレクトリに作成していくのでディレクトリを作りましょう!

    templates/layout.html

    ビューを作っていきます。

    まずは、全てのビューに共通する部分を作成します。

    デザインは、 Bootstrap4 を使ってラクをしたいと思います(笑)

    1<!DOCTYPE html>
    2<html lang="ja">
    3<head>
    4    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    5    <meta charset="UTF-8">
    6    <title>Simple toDo Application</title>
    7</head>
    8<body>
    9<div style="display: flex; flex-direction: column; min-height: 80vh">
    10    <div class="container">
    11        {% block content %}
    12        <!-- メインコンテンツ -->
    13        {% endblock %}
    14    </div>
    15</div>
    16<br>
    17<hr>
    18<footer>
    19    <div align="center">
    20        <p>Copyright &copy; RightCode Inc. All right reserves.</p>
    21        <p>Powered by FastAPI 0.36.0 &amp; starlette 0.12.9</p>
    22    </div>
    23</footer>
    24</body>
    25</html>

    このように実装してみました。

    この部分に、それぞれの固有のビューが入ります。

    1{% block content %}
    2<!-- メインコンテンツ -->
    3{% endblock %}

    ちなみに、何もメインコンテンツがないと、以下のような見た目です。

    レイアウト (templates/layout.html)

    フッターは、コンテンツが何も無い場合でも、下部に表示されるようにしています。

    templates/index.html

    それでは、トップページを簡単に書いてみましょう!

    1{% extends "layout.html" %}
    2{% block content %}
    3<br>
    4<div class="row">
    5    <div class="col-md-10">
    6        <h1>Welcome to Simple toDo application</h1>
    7    </div>
    8    <div class="col-md-2">
    9        <a href="/admin" class="btn btn-primary">Login</a>
    10    </div>
    11</div>
    12
    13<hr>
    14<p>This is a simple toDo application powered by <b>FastAPI</b>!</p>
    15
    16{% endblock %}

    現段階でのトップページ(templates/index.html)

    ひとまず、こんな感じにしておきます!

    templates/admin.html

    管理者ページも、適当に作っておきましょう。

    まずは、URLを追加し、コントローラも簡単に書きます。

    1# urls.py
    2# FastAPIのルーティング用関数
    3app.add_api_route('/', index)
    4app.add_api_route('/admin', admin)  # new
    1# controllers.py
    2
    3def admin(request: Request):
    4    return templates.TemplateResponse('admin.html',
    5                                      {'request': request,
    6                                       'username': 'admin'})
    1<!-- templates/admin.html -->
    2
    3{% extends "layout.html" %}
    4{% block content %}
    5<br>
    6<h2>Administrator page</h2>
    7<hr>
    8<p>Hi, {{ username }}.</p>
    9
    10{% endblock %}

    まだ、特に何もしない処理ですが、ビューに'username' という名前で、変数を渡してビューで展開しています。(<p>Hi, {{ username }}.</p> )

    ここは、いずれログインユーザによって変化するようにします。

    現段階での管理者ページ (templates/admin.html)

    第2回へつづく!

    今回は、ここまで!

    第1回目は、FastAPIにおける基本的な「MVCアプリケーション」の「V」と「C」について作り方を解説しました。

    次回は、管理者ページの充実と、モデル(M)の作成を行いたいと思います。

    お楽しみに!

    第2回の記事はこちら

    featureImg2019.11.21【第2回】FastAPIチュートリアル: ToDoアプリを作ってみよう【モデル構築編】FastAPIチュートリアル: toDoアプリを作ってみよう~第2回~前回の記事「【第1回】FastAPIチュートリア...

    ResponderとFastAPIを実際に使って比較してみた

    featureImg2020.01.10ResponderとFastAPIを実際に使って比較してみたResponderとFastAPIを比較したい!Webアプリケーションといえば、PHPの「CakePHP」、Pytho...

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    featureImg2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    メディアチーム
    メディアチーム
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background