🥰

[FastAPI][循環インポート回避]エラーハンドラーを別ファイルに分ける

2022/08/31に公開

こんにちは。Opt Fit見習いエンジニアのりょりょりょです。

弊社では,FastAPIを使用しています。
例外処理のコードを別ファイルに分けるのに少し躓いたのでまとめます。

やりたいこと

  • FastAPIにおいて,ハンドラーを使ってエラー処理
  • メイン処理,ハンドラー処理,エラー処理をそれぞれ別のファイルに分ける
  • その際に循環インポートを避ける

なぜやりたいか

  • 1つのファイルに全てまとめると,ファイルが肥大化していき,わかりづらくメンテナンス性も低いため
    • 例えば,APIのエンドポイントでもAPIRouterを使用することで複数ファイルに分割することができます。

実現方法

  • 以下の要領で,3つのファイルを作る

エラー処理

Exceptionを継承したクラスを作る

exceptions.py
class MyException(Exception):
    def __init__(self, status_code: int, msg: str):
	self.status_code = status_code
	self.msg = msg

ハンドラー処理

  • 自作ハンドラーを(複数ある場合は全て)関数の中に入れる

    • この例では自作のMyException_handlerハンドラーを,add_exception_handlers(app)関数に入れる
  • 関数はappを引数に取る

  • ハンドラーは,自作エラーを引数にしたデコレータ@app.exception_handler(MyException)を付ける

exception_hander.py
from fastapi.responses import JSONResponse

from exceptions import MyException

def add_exception_handlers(app):
    @app.exception_handler(MyException)
    async def MyException_handler(request: Request, exc: MyException):
	print("MyException occured!!!")
	return JSONResponse(status_code=exc.status_code,content=exc.msg)

メイン処理

main関数でadd_exception_handlers(app)を呼び出す

main.py
from fastapi import FastAPI

from exceptions import MyException
from exception_handlers import add_exception_handlers

app = FastAPI()
add_exception_handlers(app)

@app.get('/')
def index():
    raise MyException
    return None

参考

🔔採用情報

ジム施設向けDXソリューションGYMDXではエンジニアを積極採用中です。
ジュニア層のエンジニアからリーダー職まで幅広く募集しています。

2022年7月にプレシリーズAラウンドにて資金調達を実施しました。
https://prtimes.jp/main/html/rd/p/000000015.000055404.html

リードエンジニア

https://herp.careers/v1/optfit/GpvSeC-fA995

バックエンドエンジニア

https://herp.careers/v1/optfit/KsDmlZ1VhTmU

Opt Fit テックブログ

Discussion