ファーストステップ¶
最もシンプルな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: ['/home/user/code/awesomeapp']
<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提供)。
代替APIドキュメント¶
そして、http://127.0.0.1:8000/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クラスです。
ステップ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"}
dict
、list
、str
、int
などの単一値を返すことができます。
Pydanticモデルを返すこともできます(これについては後で詳しく説明します)。
JSONに自動的に変換される他の多くのオブジェクトとモデル(ORMなど)もあります。お気に入りのものを使用してみてください。既にサポートされている可能性が高いです。
要約¶
FastAPI
をインポートします。app
インスタンスを作成します。@app.get("/")
などのデコレータを使用して、パスオペレーションデコレータを記述します。- パスオペレーション関数を定義します。例:
def root(): ...
。 fastapi dev
コマンドを使用して開発サーバーを実行します。