Как использовать модель Pydantic в качестве параметра запроса в маршруте GET LitestarPython

Программы на Python
Ответить
Anonymous
 Как использовать модель Pydantic в качестве параметра запроса в маршруте GET Litestar

Сообщение Anonymous »

Я пытаюсь создать маршрут GET с помощью Litestar, который использует модель Pydantic в качестве параметра запроса. Однако сериализация не работает должным образом.
Вот минимальный пример, воспроизводящий мою проблему:

Код: Выделить всё

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])
И следующий запрос GET:

Код: Выделить всё

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()
Запрос GET приводит к следующей ошибке:

Код: Выделить всё

{
"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"
}
]
}
Похоже, что параметр запроса не сериализуется должным образом во входную модель Pydantic.
Что я пробовал:
  • Использование 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»