Formularmodelle¶
Sie können Pydantic-Modelle verwenden, um Formularfelder in FastAPI zu deklarieren.
Info
Um Formulare zu verwenden, installieren Sie zuerst python-multipart.
Stellen Sie sicher, dass Sie eine virtuelle Umgebung erstellen, sie aktivieren und es dann installieren, zum Beispiel:
$ pip install python-multipart
Hinweis
Dies wird seit FastAPI Version 0.113.0 unterstützt. 🤓
Pydantic-Modelle für Formulare¶
Sie müssen nur ein Pydantic-Modell mit den Feldern deklarieren, die Sie als Formularfelder erhalten möchten, und dann den Parameter als Form deklarieren:
from typing import Annotated
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
    username: str
    password: str
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
    return data
🤓 Other versions and variants
from fastapi import FastAPI, Form
from pydantic import BaseModel
from typing_extensions import Annotated
app = FastAPI()
class FormData(BaseModel):
    username: str
    password: str
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
    return data
Tip
Prefer to use the Annotated version if possible.
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
    username: str
    password: str
@app.post("/login/")
async def login(data: FormData = Form()):
    return data
FastAPI wird die Daten für jedes Feld aus den Formulardaten im Request extrahieren und Ihnen das von Ihnen definierte Pydantic-Modell übergeben.
Die Dokumentation testen¶
Sie können dies in der Dokumentations-UI unter /docs testen:
 
Zusätzliche Formularfelder verbieten¶
In einigen speziellen Anwendungsfällen (wahrscheinlich nicht sehr häufig) möchten Sie möglicherweise die Formularfelder auf nur diejenigen beschränken, die im Pydantic-Modell deklariert sind, und jegliche zusätzlichen Felder verbieten.
Hinweis
Dies wird seit FastAPI Version 0.114.0 unterstützt. 🤓
Sie können die Modellkonfiguration von Pydantic verwenden, um jegliche extra Felder zu verbieten:
from typing import Annotated
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
    username: str
    password: str
    model_config = {"extra": "forbid"}
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
    return data
🤓 Other versions and variants
from fastapi import FastAPI, Form
from pydantic import BaseModel
from typing_extensions import Annotated
app = FastAPI()
class FormData(BaseModel):
    username: str
    password: str
    model_config = {"extra": "forbid"}
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
    return data
Tip
Prefer to use the Annotated version if possible.
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
    username: str
    password: str
    model_config = {"extra": "forbid"}
@app.post("/login/")
async def login(data: FormData = Form()):
    return data
Wenn ein Client versucht, einige zusätzliche Daten zu senden, erhält er eine Error-Response.
Zum Beispiel, wenn der Client versucht, folgende Formularfelder zu senden:
- username:- Rick
- password:- Portal Gun
- extra:- Mr. Poopybutthole
erhält er eine Error-Response, die ihm mitteilt, dass das Feld extra nicht erlaubt ist:
{
    "detail": [
        {
            "type": "extra_forbidden",
            "loc": ["body", "extra"],
            "msg": "Extra inputs are not permitted",
            "input": "Mr. Poopybutthole"
        }
    ]
}
Zusammenfassung¶
Sie können Pydantic-Modelle verwenden, um Formularfelder in FastAPI zu deklarieren. 😎