コンテンツへスキップ

ファーストステップ

最もシンプルなFastAPIファイルは次のようになります

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

これをmain.pyファイルにコピーします。

ライブサーバーを実行する

$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:single">main.py</u>
<font color="#3465A4">INFO    </font> Using path <font color="#3465A4">main.py</font>
<font color="#3465A4">INFO    </font> Resolved absolute path <font color="#75507B">/home/user/code/awesomeapp/</font><font color="#AD7FA8">main.py</font>
<font color="#3465A4">INFO    </font> Searching for package file structure from directories with <font color="#3465A4">__init__.py</font> files
<font color="#3465A4">INFO    </font> Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>

 ╭─ <font color="#8AE234"><b>Python module file</b></font> ─╮
 │                      │
 │  🐍 main.py          │
 │                      │
 ╰──────────────────────╯

<font color="#3465A4">INFO    </font> Importing module <font color="#4E9A06">main</font>
<font color="#3465A4">INFO    </font> Found importable FastAPI app

 ╭─ <font color="#8AE234"><b>Importable FastAPI app</b></font> ─╮
 │                          │
 │  <span style="background-color:#272822"><font color="#FF4689">from</font></span><span style="background-color:#272822"><font color="#F8F8F2"> main </font></span><span style="background-color:#272822"><font color="#FF4689">import</font></span><span style="background-color:#272822"><font color="#F8F8F2"> app</font></span><span style="background-color:#272822">  </span>  │
 │                          │
 ╰──────────────────────────╯

<font color="#3465A4">INFO    </font> Using import string <font color="#8AE234"><b>main:app</b></font>

 <span style="background-color:#C4A000"><font color="#2E3436">╭────────── FastAPI CLI - Development mode ───────────╮</font></span>
 <span style="background-color:#C4A000"><font color="#2E3436">│                                                     │</font></span>
 <span style="background-color:#C4A000"><font color="#2E3436">│  Serving at: http://127.0.0.1:8000                  │</font></span>
 <span style="background-color:#C4A000"><font color="#2E3436">│                                                     │</font></span>
 <span style="background-color:#C4A000"><font color="#2E3436">│  API docs: http://127.0.0.1:8000/docs               │</font></span>
 <span style="background-color:#C4A000"><font color="#2E3436">│                                                     │</font></span>
 <span style="background-color:#C4A000"><font color="#2E3436">│  Running in development mode, for production use:   │</font></span>
 <span style="background-color:#C4A000"><font color="#2E3436">│                                                     │</font></span>
 <span style="background-color:#C4A000"><font color="#2E3436">│  </font></span><span style="background-color:#C4A000"><font color="#555753"><b>fastapi run</b></font></span><span style="background-color:#C4A000"><font color="#2E3436">                                        │</font></span>
 <span style="background-color:#C4A000"><font color="#2E3436">│                                                     │</font></span>
 <span style="background-color:#C4A000"><font color="#2E3436">╰─────────────────────────────────────────────────────╯</font></span>

<font color="#4E9A06">INFO</font>:     Will watch for changes in these directories: [&apos;/home/user/code/awesomeapp&apos;]
<font color="#4E9A06">INFO</font>:     Uvicorn running on <b>http://127.0.0.1:8000</b> (Press CTRL+C to quit)
<font color="#4E9A06">INFO</font>:     Started reloader process [<font color="#34E2E2"><b>2265862</b></font>] using <font color="#34E2E2"><b>WatchFiles</b></font>
<font color="#4E9A06">INFO</font>:     Started server process [<font color="#06989A">2265873</font>]
<font color="#4E9A06">INFO</font>:     Waiting for application startup.
<font color="#4E9A06">INFO</font>:     Application startup complete.

出力には、次のような行があります

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

この行は、アプリケーションがローカルマシンで提供されているURLを示しています。

確認する

ブラウザでhttp://127.0.0.1:8000を開きます。

JSONレスポンスが次のように表示されます

{"message": "Hello World"}

インタラクティブなAPIドキュメント

次に、http://127.0.0.1:8000/docsにアクセスします。

自動生成されたインタラクティブなAPIドキュメントが表示されます(Swagger UI提供)。

Swagger UI

代替APIドキュメント

そして、http://127.0.0.1:8000/redocにアクセスします。

代替の自動生成されたドキュメントが表示されます(ReDoc提供)。

ReDoc

OpenAPI

FastAPIは、APIを定義するためのOpenAPI標準を使用して、API全体の「スキーマ」を生成します。

"スキーマ"

"スキーマ"とは、何かを定義または記述することです。それを実装するコードではなく、単なる抽象的な記述です。

API "スキーマ"

この場合、OpenAPIは、APIのスキーマを定義する方法を規定する仕様です。

このスキーマ定義には、APIパス、それらが受け入れる可能性のあるパラメータなどが含まれています。

データ "スキーマ"

"スキーマ"という用語は、JSONコンテンツのようなデータの形状を指すこともあります。

その場合、JSON属性とそれらが持つデータ型などを意味します。

OpenAPIとJSONスキーマ

OpenAPIはAPIのAPIスキーマを定義します。そして、そのスキーマには、APIによって送受信されるデータの定義(または「スキーマ」)が含まれており、JSON Schema(JSONデータスキーマの標準)を使用しています。

openapi.jsonを確認する

生のOpenAPIスキーマがどのように見えるかについて興味がある場合、FastAPIはAPI全体の記述を含むJSON(スキーマ)を自動的に生成します。

次で直接確認できます:http://127.0.0.1:8000/openapi.json

次のようなJSONが表示されます

{
    "openapi": "3.1.0",
    "info": {
        "title": "FastAPI",
        "version": "0.1.0"
    },
    "paths": {
        "/items/": {
            "get": {
                "responses": {
                    "200": {
                        "description": "Successful Response",
                        "content": {
                            "application/json": {



...

OpenAPIの用途

OpenAPIスキーマは、含まれている2つのインタラクティブなドキュメントシステムを駆動するものです。

そして、OpenAPIに基づいた数十の代替案があります。これらの代替案を、FastAPIで構築されたアプリケーションに簡単に追加できます。

また、APIと通信するクライアントのコードを自動的に生成することもできます。例えば、フロントエンド、モバイル、またはIoTアプリケーションなどです。

要約、ステップバイステップ

ステップ1: FastAPIをインポートする

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

FastAPIは、APIのすべての機能を提供するPythonクラスです。

"技術的な詳細"

FastAPIは、Starletteから直接継承するクラスです。

FastAPIでも、Starletteのすべての機能を使用できます。

ステップ2:FastAPI "インスタンス"の作成

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

ここで、app変数はFastAPIクラスの"インスタンス"になります。

これが、API全体を作成するための主要なインタラクションポイントになります。

ステップ3:パスオペレーションの作成

パス

ここで"パス"とは、最初の/から始まるURLの最後の部分を指します。

例えば、このようなURLの場合

https://example.com/items/foo

…パスは

/items/foo

Info

"パス"は、一般的に"エンドポイント"または"ルート"とも呼ばれます。

APIを構築する際、"パス"は"懸念事項"と"リソース"を分離するための主要な方法です。

オペレーション

ここで"オペレーション"とは、HTTPの"メソッド"の1つを指します。

例えば

  • POST
  • GET
  • PUT
  • DELETE

…そして、より特殊なメソッド

  • OPTIONS
  • HEAD
  • PATCH
  • TRACE

HTTPプロトコルでは、これらの"メソッド"の1つ以上を使用して、各パスと通信できます。


APIを構築する際には、通常、これらの特定のHTTPメソッドを使用して特定のアクションを実行します。

通常は以下のように使用します。

  • POST:データを作成します。
  • GET:データを読み取ります。
  • PUT:データを更新します。
  • DELETE:データを削除します。

そのため、OpenAPIでは、各HTTPメソッドは"オペレーション"と呼ばれます。

ここでは、これらも"**オペレーション**"と呼びます。

パスオペレーションデコレータの定義

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

@app.get("/")は、FastAPIに対して、その下の関数が、

  • パス/への
  • getオペレーション を使用するリクエストの処理を担当することを伝えます。

"@decorator 情報"

Pythonにおける@something構文は"デコレータ"と呼ばれます。

関数の頭に配置します。まるで素敵な装飾帽のようです(おそらくこの用語の由来でしょう)。

"デコレータ"は、下の関数を取得して、何か処理を行います。

この場合、このデコレータは、FastAPIに、下の関数がパス/オペレーションgetに対応することを伝えます。

これが"**パスオペレーションデコレータ**"です。

他のオペレーションも使用できます。

  • @app.post()
  • @app.put()
  • @app.delete()

そして、より特殊なメソッド

  • @app.options()
  • @app.head()
  • @app.patch()
  • @app.trace()

ヒント

各オペレーション(HTTPメソッド)は自由に使用できます。

FastAPIは、特定の意味を強制しません。

ここの情報はガイドラインとして提示されており、必須ではありません。

例えば、GraphQLを使用する場合、通常はPOSTオペレーションのみを使用してすべてのアクションを実行します。

ステップ4:パスオペレーション関数の定義

これが私たちの"パスオペレーション関数"です。

  • パス/です。
  • オペレーションgetです。
  • 関数:"デコレータ"(@app.get("/")の下)の下にある関数です。
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

これはPython関数です。

GETオペレーションを使用してURL"/"へのリクエストを受信するたびに、FastAPIによって呼び出されます。

この場合、async関数です。


async defではなく、通常の関数として定義することもできます。

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def root():
    return {"message": "Hello World"}

注記

違いがわからない場合は、非同期:「急いでいますか?」を参照してください。

ステップ5:コンテンツの返却

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

dictliststrintなどの単一値を返すことができます。

Pydanticモデルを返すこともできます(これについては後で詳しく説明します)。

JSONに自動的に変換される他の多くのオブジェクトとモデル(ORMなど)もあります。お気に入りのものを使用してみてください。既にサポートされている可能性が高いです。

要約

  • FastAPIをインポートします。
  • appインスタンスを作成します。
  • @app.get("/")などのデコレータを使用して、パスオペレーションデコレータを記述します。
  • パスオペレーション関数を定義します。例:def root(): ...
  • fastapi devコマンドを使用して開発サーバーを実行します。