Problem mit Fastapi-, Pydantic- und Kebab-Case-HeaderfeldernPython

Python-Programme
Guest
 Problem mit Fastapi-, Pydantic- und Kebab-Case-Headerfeldern

Post by Guest »

In meinem Fastapi-Projekt finde ich, wenn ich eine gemeinsame Header-Definition mit Pydantic erstelle, dass sich Kebab-Case-Headerfelder nicht wie erwartet verhalten. Die "magische" Konvertierung von Kebab-Case-Header-Feldern in der Anfrage zu ihren Kollegen Snake_Case funktioniert nicht, zusätzlich zu Inkonsistenzen in den generierten Swagger-Dokumenten. Diese pydantische Header-Klasse, damit die Swagger-Dokumente und das Verhalten übereinstimmen? überschreiben ">

Code: Select all

### 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

Wenn ich dies ausführe und mir die Swagger -Dokumente unter http: // localhost: 8000/docs anschaue. Ich sehe dies, was korrekt aussieht:

Und wenn ich es ausprobieren ", wird es so generieren, was ich als richtige Anfrage erwarten würde: < /p>

Code: Select all

curl -X 'GET' \
'http://localhost:8000/' \
-H 'accept: application/json' \
-H 'simpleheader: foo' \
-H 'a-kebab-header: bar'
< /code>
Aber in der Antwort wird deutlich, dass der Kebab-Case-Header nicht richtig empfangen wurde: < /p>
{
"headers received": {
"simpleheader": "foo",
"a-kebab-header": null
}
}
< /code>
Ändern des Headernamens in Snake_Case "a_kebab_header" in der Anforderung auch nicht. funktioniert auch wie erwartet.  Die Swagger-Dokumente und das tatsächliche Verhalten sind inkonsistent.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>
Beachten Sie, dass dies jetzt zu den Swagger -Dokumenten führt, die es in Snake_Case angeben: < /p>

und mit "Probieren Sie es aus" in der Snake_Case -Variante: 
. curl -X 'GET' \
'http://localhost:8000/' \
-H 'accept: application/json' \
-H 'simpleheader: foo' \
-H 'a_kebab_header: bar'
< /code>
Aber überraschenderweise funktioniert das nicht!  Die Antwort: < /p>
{
"headers received": {
"simpleheader": "foo",
"a_kebab_header": null
}
}
< /code>
Aber in einem überraschenden Ende, wenn ich die Anforderung in Kebab-Case manuell neu schreibe: < /p>
curl -X 'GET' \
'http://localhost:8000/' \
-H 'accept: application/json' \
-H 'simpleheader: foo' \
-H 'a-kebab-header: bar'
< /code>
Es nimmt schließlich diesen Header-Wert über die magische Übersetzung auf und ich erhalte die gewünschten Ergebnisse zurück: < /p>
{"headers received":{"simpleheader":"foo","a_kebab_header":"bar"}}
Was ist der richtige Weg, um diese pydantische Headerklasse anzugeben, damit die Swagger -Dokumente und das Verhalten übereinstimmen? Machen Sie sich belästigt. , Aber es verwendet Pydantic nicht und so verliere ich die Fähigkeit, eine gemeinsame Header -Struktur leicht in meinem Projekt zu definieren und zu verwenden, und muss sie stattdessen für jeden Endpunkt einzeln deklarieren: < /p>

Code: Select all

"""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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post