タイトルにある通り、fastapiのrouterでハマったので今後同じミスをしないように記録として残しておきます。
業務内で起きたエラーで、実際のコードをこちらに載せることには抵抗があったため、ドキュメントを元にまとめていきます。
エラー内容
エラー内容は以下の通りです。(こちらは私が実際に遭遇したエラーです。)
{
"loc": [
"path",
"account_id"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
このエラーはpydanticのエラーで以下の意味を持ちます。
・ loc → どこでエラーが起きているか
・ msg → エラー内容
・ type → エラーの種類
よって、今回のエラーは「pathのaccount_idの値が有効な数値ではありません」という内容のエラーです。
そこで私は、「account_idなんて今回使いたいパスに指定されていないのになぜこんなエラーが出るのだろう」と頭を悩ませていました。
結論
いきなり結論に入ります。
公式ドキュメントにも記載されていますが、fastapiのrouterでpath operationを作成する際は固定パスを先に持ってこなくてはいけません。
以下、ドキュメント内のコードです。
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/me") #固定パスが先
async def read_user_me():
return {"user_id": "the current user"}
@app.get("/users/{user_id}") #動的パスは後に指定する
async def read_user(user_id: str):
return {"user_id": user_id}
fastapi 順序の問題
もしこれを逆にして、@app.get("/users/{user_id}")の処理を先に持ってきてしまうと、値が"me"であるパラメータuser_idであると勘違いをしてしまそうです。
このようにHTTPメソッドが同じ処理を複数行う場合は、記述の順番に気をつけましょう。
最後に
ちょっと前にreact-router-domでも同じようなことで頭を悩ませたなぁ...