FastAPI系の知識
Pydatic
- data型
- Separatorは「-」しか受け付けない(YYYYMMDDやYYYY/MM/DDはエラーになる)
- YYYYMDDもエラーにされる(2025-09-01はOK、2025-9-01はエラー)
Access-Control-Allow-Originに関するエラーが発生した場合
- バックエンド(今回はFastAPI)で対応する
from fastapi import FastAPI
from starlette.middleware import Middleware
from starlette.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://localhost:9000",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"]
)
@app.get("/")
async def read_root():
return {"Hello": "World"}
python
- .pycファイルとは
-
Pythonソースコード(.pyファイル)をPythonインタプリタが実行しやすいバイトコードに変換(コンパイル)した結果をキャッシュしたファイル
-
__init__.py - Pythonのディレクトリをパッケージとして認識させるためのファイル
- 省略すると
- unittestがテストモジュールを認識しない
- lintツールがモジュールを正しく検出しない
- 複数のモジュールが存在するプロジェクトでimportエラーが発生
Pytest
uv add --dev pytest pytest-asyncio httpxuv add --dev pytest-env- pytest-asyncio
- FastAPIのasync関数をテストできるようになる
- httpx
- FastAPIのテストクライアントとして使う
-
pytest-env
- テスト用の環境変数を設定する際に必要
-
@pytest.fixture -
テストのh前処理(DBをセットアップする、モックを作成するなど)を行うためのpytestの機能
- そのため、常に実行したい初期処理などを定義する場合に使用する
- autouse=Trueで、テスト関数にfixtureを指定せずとも、全てのテスト関数で自動的に実行される
- scopeによって、どの範囲で実行されるかを指定可能
- function(関数ごと)
- class(クラスごと)
- module(モジュールごと)
- session(セッションごと)
-
pytest.ini
-
root配下に置く
-
テスト実行
- pytest -v
Ruff導入
uv add --dev ruff
- チェック
-
uv run ruff check . -
自動修正(コードの修正を自動で行いたい場合は、
--fixオプションを使用する) -
uv run ruff check . --fix -
エラー集
| エラー番号 | 内容 | 対応策 |
|---|---|---|
| UP017 | datetime.timezone.utcの代わりにdatetime.UTCエイリアスを使いなさい | datetime.UTCを使用する |
| B904 | 例外ハンドラ内でfrom句を使用せずに例外を再スローしないこと | as ~ fromを使用する |
- フォーマット
-
uv run ruff format .
# Ruff全体の挙動を制御する基本ブロック
[too.ruff]
line-length = 120 # 1行の最大文字数を設定(デフォルトは88)
target-version = "py311" # 対象とするPythonバージョンを指定
include =
exclude = [ # 除外したいファイルやフォルダを指定
".git",
".venv",
"__pycache__",
".pytest_cache",
".mypy_cache",
"alembic",
"migrations",
]
[tool.ruff.lint]
select = [
"A", # 一般的なコード品質に関連するルール
"B", # pythonの最新の書き方かチェックする
"C", # 複雑性に関連するルール
"D", # ドキュメントに関連するルール
"E", # Pycodestyleエラー
"F", # 未使用import, 未定義変数が無いかチェックする
"I", # importの並びを整列する
"N", # 名前に関連するルール
"Q", # クォートスタイルに関連するルール
"R", # 冗長なコードに関連するルール
"S", # セキュリティに関連するルール
"T", # 型ヒントに関連するルール
"UP", # Pythonのバージョンアップに関連するルール
]
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
[tool.ruff.lint.per-file-ignores]
"src/routers/*.py" = ["B008"]
"migrations/env.py" = ["E402", "I001"]
"src/main.py" = ["E402", "I001"]
mypy導入
- インストールコマンド
uv add --dev mypy
sqlalchemy
- インストールコマンド
uv add sqlalchemy-
※
uv pip install sqlalchemyでは依存関係が残らず、他の環境でエラーになる可能性あり -
Mapped[str]と記述すると、自動的にnullable==Falseと解釈する
- カラム名は属性名から自動名で決まるので、
name=...は不要 - カラム名
- 実際のDBテーブルの列名
-
属性名
- Pythonのクラス属性名
-
create_engine
- データべーへの接続口を作成する関数
Alembic
- コマンド
- インストール
uv add alembic
-
セットアップ
alembic init <ディレクトリ名>
python # # 例) alembic init alembic # # 以下ディレクトリとファイルが生成される # migration/ # | - README # | - env.py # | - script.py.mako # | - versions/ # alembic.ini- マイグレーションの巻き戻し
alembic downgrade -1- 最新版のマイグレーションを適用
alembic upgrade head- マイグレーションファイルの作成
alembic revision --autogenerate -m "{ここがファイル名に付与される}"※--autogenerateを付与しないと空ファイルが作成される
python-dotenv
.envファイルを読み込めるようにするライブラリ- インストールコマンド
uv add python-dotenv