Вот минимальный пример, воспроизводящий мою проблему:
Код: Выделить всё
from pydantic import BaseModel
from litestar import Litestar, get, Controller
class Input(BaseModel):
foo: str
bar: str
class RootController(Controller):
path = "/"
@get()
def input(self, input: Input) -> str:
return input.foo + input.bar
app = Litestar(route_handlers=[RootController])
Код: Выделить всё
import httpx
import json
params = {
"input": {
"foo": "test",
"bar": "this"
}
}
def prepare_encode(params: dict) -> dict:
for key, value in params.items():
if isinstance(value, dict):
params[key] = json.dumps(value, indent=None)
return params
params = prepare_encode(params)
response = httpx.get("http://localhost:8000/", params=params)
response.json()
Код: Выделить всё
{
"status_code": 400,
"detail": "Validation failed for GET /?input=%7B%22foo%22%3A%20%22test%22%2C%20%22bar%22%3A%20%22this%22%7D",
"extra": [
{
"message": "Input should be a valid dictionary or instance of Input"
}
]
}
Что я пробовал:
- Использование json.dumps для кодирования словаря перед отправкой его в качестве параметра.
- Отладка реализации модели Litestar, где параметр запроса предоставляется в виде строки в преобразование msgspec. Это явно не соответствует требуемому типу.
Я ожидаю, что входной параметр запроса будет правильно проанализирован и сериализован в модель ввода, что позволит запросу GET завершиться успешно без ошибок проверки.
Вопрос:
Как я могу правильно передать модель Pydantic в качестве параметра запроса в Litestar ПОЛУЧИТЬ маршрут? Чего мне не хватает в процессе сериализации? Возможно ли это вообще?
Дополнительный контекст:
- Версия Litestar: 2.10.0
- Версия Pydantic: 2.8.2
- Версия httpx: 0.27.0
Подробнее здесь: https://stackoverflow.com/questions/787 ... -get-route
Мобильная версия