Проблема с Fastapi, Pydantic и Kebab-CasePython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с Fastapi, Pydantic и Kebab-Case

Сообщение Anonymous »

В моем проекте FASTAPI, если я создаю общее определение заголовка с Pydantic, я обнаружил, что поля заголовка с кебабом не ведут себя, как и ожидалось. «Волшебное» преобразование из полей заголовка с кебабом в запросе на их аналоги Snake_cace не работает, в дополнение к несоответствиям в сгенерированных документах Swagger. < /P>
Вот минимальное воспроизведение проблемы : < /p>
### main.py

from typing import Annotated
from fastapi import FastAPI, Header
from pydantic import BaseModel, Field

app = FastAPI()

class CommonHeaders(BaseModel):
simpleheader: str
a_kebab_header: str | None = Field(
default=None,
title="a-kebab-header",
alias="a-kebab-header",
description="This is a header that should be specified as `a-kebab-header`",
)

@app.get("/")
def root_endpoint(
headers: Annotated[CommonHeaders, Header()],
):
result = {"headers received": headers}
return result


Если я запускаю это, и посмотрю документы Swagger по адресу http: // localhost: 8000/docs Я вижу это, что выглядит правильно:

И если я «попробую», это будет генерировать то, что я ожидаю в качестве правильного запроса: < /p>
curl -X 'GET' \
'http://localhost:8000/' \
-H 'accept: application/json' \
-H 'simpleheader: foo' \
-H 'a-kebab-header: bar'
< /code>
Но в ответе становится ясно, что он неправильно получил заголовок кебаба: < /p>
{
"headers received": {
"simpleheader": "foo",
"a-kebab-header": null
}
}
< /code>
Изменение имени заголовка на snake_case "a_kebab_header" в запросе тоже не работает. Т работа, как и ожидалось. Документы и фактическое поведение Swagger не соответствуют.class CommonHeaders(BaseModel):
simpleheader: str
a_kebab_header: str | None = Field(
default=None,
description="This is a header that should be specified as `a-kebab-header`",
)
< /code>
Обратите внимание, что теперь это приводит к тому, что документы Swagger с указанием его в snake_case: < /p>

и использование "Попробуйте это" приводит к варианту snake_case:
curl -X 'GET' \
'http://localhost:8000/' \
-H 'accept: application/json' \
-H 'simpleheader: foo' \
-H 'a_kebab_header: bar'
< /code>
Но, как ни странно, это не работает! Ответ: < /p>
{
"headers received": {
"simpleheader": "foo",
"a_kebab_header": null
}
}
< /code>
Но в неожиданном окончании, если я вручную переписываю запрос в Kebab-case: < /p>
curl -X 'GET' \
'http://localhost:8000/' \
-H 'accept: application/json' \
-H 'simpleheader: foo' \
-H 'a-kebab-header: bar'
< /code>
, наконец, поднимает это значение заголовка с помощью волшебного перевода, и я получаю нужные результаты обратно: < /p>
{"headers received":{"simpleheader":"foo","a_kebab_header":"bar"}}
< /code>
Как правильное способ указать этот объект заголовка, чтобы сочетаться с чванствами и поведением соответствовало? Если документы несовместимы с поведением, я собираюсь запотез. В приложении (отображение и работа в качестве Kebab-case), но оно не использует Pydantic, и поэтому я теряю возможность легко определять и использовать общую структуру заголовка в моем проекте, и вместо этого необходимо объявить их индивидуально для каждой конечной точки: < /p>
"""Alternative version without Pydantic."""
from typing import Annotated
from fastapi import FastAPI, Header

app = FastAPI()

@app.get("/")
def root_endpoint(
simpleheader: Annotated[str, Header()],
a_kebab_header: Annotated[
str | None,
Header(
title="a-kebab-header",
description="This is a header that should be specified as `a-kebab-header`",
),
] = None,
):
result = {
"headers received": {
"simpleheader": simpleheader,
"a_kebab_header": a_kebab_header,
}
}
return result


Подробнее здесь: https://stackoverflow.com/questions/794 ... der-fields
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Проблема с Fastapi, Pydantic и Kebab-Case
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Проблема с Fastapi, Pydantic и Kebab-Case
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Проблема с Fastapi, Pydantic и Kebab-Case
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Проблема с Fastapi, Pydantic и Kebab-Case
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Проблема с Fastapi, Pydantic и Kebab-Case
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous

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