Open11
python メモ

rye init
rye pin 3.12
rye add --dev ruff
rye sync

{
// python path
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
"python.envFile": "${workspaceFolder}/.venv",
"ruff.path": [
"${workspaceFolder}/.venv/bin/ruff"
],
"[python]": {
"editor.formatOnSave": true
}
}

SQLModel + FastAPI が良さげ

table=True となっているとvalidationされない。
class Hero(SQLModel):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
# name, secret_nameが指定されてないので、例外発生
hero = Hero()
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
# name, secret_nameが指定されてないが、table=Trueなので、例外発生しない
hero = Hero()

Fast API — Repository Pattern and Service Layer

これらをみて uv 環境、dev container 環境を整える

uv には タスクランナーが無いので、https://github.com/nat-n/poethepoet などを使う

FastAPI
エクセルファイルダウンロード のサンプル
@router.get("/download_excel1", response_class=FileResponse)
def download_excel1() -> FileResponse:
file_path = Path("example.xlsx")
if file_path.exists():
return FileResponse(
path=file_path,
filename="example.xlsx", # ダウンロード時のファイル名
media_type=MEDIA_TYPE_EXCEL,
)
raise HTTPException(status_code=404)
@router.get("/download_excel2", response_class=StreamingResponse)
def download_excel2() -> StreamingResponse:
output = BytesIO()
workbook = openpyxl.Workbook()
sheet = workbook.active
assert sheet is not None # None でないことを明示 # noqa: S101
sheet["A1"] = "Hello, World!"
workbook.save(output)
output.seek(0) # ストリームの先頭に移動
# ストリームをレスポンスとして返す
return StreamingResponse(
output,
media_type=MEDIA_TYPE_EXCEL,
headers={"Content-Disposition": "attachment; filename=example.xlsx"},
)
ログインするとコメントできます