見出し画像

【FastAPI】任意の(省略可能な)クエリパラメータについての注意(微妙にはまった話)

FasgAPIでは、パスパラメータとして指定していない、パラメータは自動でクエリパラメータとして判定される。

そして、クエリパラメータは、Optional[型] = Noneとすることで、デフォルト値が None の任意の(省略可能な)パラメータ(Optionalなパラメータ)になる。

(少なくとも自分は)間違えやすいのが、パラメータ(変数)名:Optional[型]として、デフォルト値を設定しない時には、このパラメータは必須のものと解釈される。また、デフォルト値を設定した任意のパラメータは、そのほかのパラメータよりも後述(右側配置)しなければならない。

当たり前といえば当たり前のことだが、、、

任意のパラメータが複数並ぶときは、それらの型などが同じ場合、その個数分のパラメータがないときは、実引数を手前から順に任意パラメータとして解釈して扱われる。

どういうことかというと、、、

async def image_proc(src: any,
                                           procId: int,
                                           threshold: Optional[str] = None,
                                           kernelSize: Optional[str]= None,
                                           db: Session = Depends(get_db)) -> any:

として宣言していた場合、

ここの画像処理では、threshold(閾値)やkernelSize(カーネルサイズ)はどちらも同時に渡されることはない、という(勝手に)想定をしているが、

thresholdを渡されようとkernelSizeを渡されようと、任意パラメータに順に適用していくため、(src: any, procId: int以降の)三つ目のパラメータは全て

thresholdとして扱われ、その後に続くdb: Sessionパラメータが四つ目のkernelSizeとして取得されてしまうのである。

対処法はいくつかあるような気がするが、(これを含めた複数のエラーにハマりすぎて)徹夜明けで頭が回ってないので、とりあえず任意のパラメータの宣言数を一つにする、という形で修正する。

複数の任意パラメータの宣言方法(仕様上可能かどうかも含めて)、後ほどまとめる。

(文章がわかりづらいのは、元々のセンスと睡魔のせいなので、後ほど余裕があれば書き直します)

参考1:公式ドキュ(Query Parameters¶)

参考2:FastAPI Tutorialメモ その3 Query Parameters

この記事が気に入ったらサポートをしてみませんか?