🥰
[FastAPI][循環インポート回避]エラーハンドラーを別ファイルに分ける
こんにちは。Opt Fit見習いエンジニアのりょりょりょです。
弊社では,FastAPIを使用しています。
例外処理のコードを別ファイルに分けるのに少し躓いたのでまとめます。
やりたいこと
- FastAPIにおいて,ハンドラーを使ってエラー処理
- メイン処理,ハンドラー処理,エラー処理をそれぞれ別のファイルに分ける
- その際に循環インポートを避ける
なぜやりたいか
- 1つのファイルに全てまとめると,ファイルが肥大化していき,わかりづらくメンテナンス性も低いため
- 例えば,APIのエンドポイントでも
APIRouter
を使用することで複数ファイルに分割することができます。
- 例えば,APIのエンドポイントでも
実現方法
- 以下の要領で,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
参考
-
FastAPIハンドリングエラー
-
Bigger Applications - Multiple Files
-
ルーター(Routers)
-
Error handlers in separate module?
🔔採用情報
ジム施設向けDXソリューションGYMDXではエンジニアを積極採用中です。
ジュニア層のエンジニアからリーダー職まで幅広く募集しています。
2022年7月にプレシリーズAラウンドにて資金調達を実施しました。
リードエンジニア
バックエンドエンジニア
Discussion