Hi guys,
i tried different dataclass libs for model definition. Using msgspec.Struct, results in a bad (post) request although it works when using Pydantic, dataclass or attrs. To reproduce this error, comment all models expect one.
from pydantic import BaseModel
from dataclasses import dataclass
from msgspec import Struct
from attrs import define
from litestar import get, Litestar, post
class Resource(BaseModel):
id: int
name: str
@dataclass
class Resource:
id: int
name: str
@define
class Resource:
id: int
name: str
class Resource(Struct):
id: int
name: str
@get("/resources")
async def retrieve_resource() -> Resource:
return Resource(id=1, name="my resource")
@post("/resources")
async def mirror_resource(data: Resource) -> Resource:
return data
app = Litestar(route_handlers=[retrieve_resource, mirror_resource])
Run the app usint litestart run --reload.
Testing the app:
res = requests.get("http://localhost:8000/resources").json()
print(res)
# {'id': 1, 'name': 'my resource'}
res = requests.post("http://localhost:8000/resources", json={'id': 1, 'name': 'my resource'}).json()
print(res)
# {'id': 1, 'name': 'my resource'}
# With msgspec.Struct the post requests returns a 400.
# {'status_code': 400,
# 'detail': 'Validation failed for POST http://localhost:8000/resources',
# 'extra': [{'message': 'instance of Resource expected', 'key': 'data'}]}
Is this a bug, or did I something wrong?