Skip to content

Problem when using with a pydantic model #42

Description

@hf-sheese

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

Activity

  1. self-assigned this
    on Apr 4, 2024
  2. maces commented on Apr 4, 2024

    @maces
    Owner

    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?

  3. hf-kklein commented on Apr 4, 2024

    @hf-kklein

    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:

    if not isinstance(response, Mapping):

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions