Problem when using with a pydantic model
hf-sheese opened this issue · comments
I want to write a simple healthcheck endpoint with pydantic and call it using htmx. The endpoint returns a pydantic model. However, if I want to run the endpoint, I get: "AttributeError: 'dict' object has no attribute 'encode'. I have to manually convert the model to a dictionary using model_dump to solve this problem.
Here is the sourcecode:
FastAPI endpoint:
@router.get("/health", response_model=HealthcheckResult)
async def health_check():
result = HealthcheckResult(passed_all_checks=True)
return result
htmx wrapper:
@router.get("/health", response_class=HTMLResponse)
@htmx("health", "index", health_check)
async def health_check_htmx(
request: Request,
):
pass
pydantic model:
`class` HealthcheckResult(BaseModel):
passed_all_checks: bool
Up until now only dicts are supported as you noticed. Will label this as a possible enhancement. Expectation wise we are talking about transparent handling of my_model.model_dump()
, right?
Our expectation is:
If my endpoint returns a Pydantic model, then the model.model_dump(mode="json")
should be called automatically and the dumped dict should be passed on to the jinja2 template.
My best guess is, that it could be handled around here:
fastapi-htmx/fastapi_htmx/htmx.py
Line 145 in a4f0b8a
Instead of only checking for instance of mapping there should also be a check like:
if isinstance(response, BaseModel):
response = response.model_dump(mode="json")
if not isinstance(response, Mapping):
...
A type-checker will complain about this, but I guess it would work.