【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¶)