最初のステップ¶
最もシンプルな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:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
Searching for package file structure from directories
with <font color="#3465A4">__init__.py</font> files
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> 🐍 main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with
the following code:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000/docs</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> tip </font></span> Running in development mode, for production use:
<b>fastapi run</b>
Logs:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Will watch for changes in these directories:
<b>[</b><font color="#4E9A06">'/home/user/code/awesomeapp'</font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> <b>(</b>Press CTRL+C
to quit<b>)</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started reloader process <b>[</b><font color="#34E2E2"><b>383138</b></font><b>]</b> using WatchFiles
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>383153</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> 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 Schema¶
OpenAPIはAPIのAPIスキーマを定義します。そしてそのスキーマには、JSONデータスキーマの標準であるJSON Schemaを使用して、APIが送受信するデータの定義(または「スキーマ」)が含まれています。
openapi.json
を確認¶
生のOpenAPIスキーマがどのように見えるか興味がある場合は、FastAPIがすべてのAPIの説明を含むJSON(スキーマ)を自動的に生成します。
直接次のURLで確認できます: 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
情報
「パス」は一般的に「エンドポイント」または「ルート」とも呼ばれます。
API を構築する際、「パス」は「関心事」や「リソース」を分離する主要な方法です。
操作¶
ここでの「操作」は、HTTP「メソッド」のいずれかを指します。
次のいずれか
POST
GET
PUT
DELETE
...そして、さらに珍しいもの
OPTIONS
HEAD
PATCH
TRACE
HTTPプロトコルでは、これらの「メソッド」のいずれか(または複数)を使用して各パスと通信できます。
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
構文は「デコレーター」と呼ばれます。
関数の上に置きます。きれいな飾り帽子のように(おそらくそれが語源でしょう)。
「デコレーター」は下の関数を受け取り、それに対して何かを行います。
私たちの場合、このデコレーターは、下の関数がパス /
に操作 get
で対応することをFastAPIに伝えます。
それは「パスオペレーションデコレーター」です。
他の操作も使用できます
@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関数です。
FastAPI は、GET
操作を使用して URL 「/
」へのリクエストを受信するたびに、この関数を呼び出します。
この場合、async
関数です。
async def
の代わりに通常の関数として定義することもできます
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello World"}
注釈
違いがわからない場合は、Async: "お急ぎですか?" を確認してください。
ステップ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
を使用して開発サーバーを実行します。