Jetzt, da wir gesehen haben, wie Path und Query verwendet werden, schauen wir uns fortgeschrittenere Verwendungsmöglichkeiten von Requestbody-Deklarationen an.
Zuerst einmal, Sie können Path-, Query- und Requestbody-Parameter-Deklarationen frei mischen und FastAPI wird wissen, was zu tun ist.
Und Sie können auch Body-Parameter als optional kennzeichnen, indem Sie den Defaultwert auf None setzen:
fromtypingimportAnnotatedfromfastapiimportFastAPI,PathfrompydanticimportBaseModelapp=FastAPI()classItem(BaseModel):name:strdescription:str|None=Noneprice:floattax:float|None=None@app.put("/items/{item_id}")asyncdefupdate_item(item_id:Annotated[int,Path(title="The ID of the item to get",ge=0,le=1000)],q:str|None=None,item:Item|None=None,):results={"item_id":item_id}ifq:results.update({"q":q})ifitem:results.update({"item":item})returnresults
fromtypingimportAnnotated,UnionfromfastapiimportFastAPI,PathfrompydanticimportBaseModelapp=FastAPI()classItem(BaseModel):name:strdescription:Union[str,None]=Noneprice:floattax:Union[float,None]=None@app.put("/items/{item_id}")asyncdefupdate_item(item_id:Annotated[int,Path(title="The ID of the item to get",ge=0,le=1000)],q:Union[str,None]=None,item:Union[Item,None]=None,):results={"item_id":item_id}ifq:results.update({"q":q})ifitem:results.update({"item":item})returnresults
fromtypingimportUnionfromfastapiimportFastAPI,PathfrompydanticimportBaseModelfromtyping_extensionsimportAnnotatedapp=FastAPI()classItem(BaseModel):name:strdescription:Union[str,None]=Noneprice:floattax:Union[float,None]=None@app.put("/items/{item_id}")asyncdefupdate_item(item_id:Annotated[int,Path(title="The ID of the item to get",ge=0,le=1000)],q:Union[str,None]=None,item:Union[Item,None]=None,):results={"item_id":item_id}ifq:results.update({"q":q})ifitem:results.update({"item":item})returnresults
Tipp
Bevorzugen Sie die Annotated-Version, falls möglich.
fromfastapiimportFastAPI,PathfrompydanticimportBaseModelapp=FastAPI()classItem(BaseModel):name:strdescription:str|None=Noneprice:floattax:float|None=None@app.put("/items/{item_id}")asyncdefupdate_item(*,item_id:int=Path(title="The ID of the item to get",ge=0,le=1000),q:str|None=None,item:Item|None=None,):results={"item_id":item_id}ifq:results.update({"q":q})ifitem:results.update({"item":item})returnresults
Tipp
Bevorzugen Sie die Annotated-Version, falls möglich.
fromtypingimportUnionfromfastapiimportFastAPI,PathfrompydanticimportBaseModelapp=FastAPI()classItem(BaseModel):name:strdescription:Union[str,None]=Noneprice:floattax:Union[float,None]=None@app.put("/items/{item_id}")asyncdefupdate_item(*,item_id:int=Path(title="The ID of the item to get",ge=0,le=1000),q:Union[str,None]=None,item:Union[Item,None]=None,):results={"item_id":item_id}ifq:results.update({"q":q})ifitem:results.update({"item":item})returnresults
Hinweis
Beachten Sie, dass in diesem Fall das item, welches vom Body genommen wird, optional ist. Da es None als Defaultwert hat.
Beachten Sie, dass, obwohl item wie zuvor deklariert wurde, es nun unter einem Schlüssel item im Body erwartet wird.
FastAPI wird die automatische Konvertierung des Requests übernehmen, sodass der Parameter item seinen spezifischen Inhalt bekommt, genau so wie der Parameter user.
Es wird die Validierung dieser zusammengesetzten Daten übernehmen, und sie im OpenAPI-Schema und der automatischen Dokumentation dokumentieren.
So wie Query und Path für Query- und Pfad-Parameter, hat FastAPI auch das Äquivalent Body, um Extra-Daten für Body-Parameter zu definieren.
Zum Beispiel, das vorherige Modell erweiternd, könnten Sie entscheiden, dass Sie einen weiteren Schlüssel importance haben möchten, im selben Body, Seite an Seite mit item und user.
Wenn Sie diesen Parameter einfach so hinzufügen, wird FastAPI annehmen, dass es ein Query-Parameter ist.
Aber Sie können FastAPI instruieren, ihn als weiteren Body-Schlüssel zu erkennen, indem Sie Body verwenden:
Nehmen wir an, Sie haben nur einen einzelnen item-Body-Parameter, ein Pydantic-Modell Item.
Normalerweise wird FastAPI dann seinen JSON-Body direkt erwarten.
Aber wenn Sie möchten, dass es einen JSON-Body erwartet, mit einem Schlüssel item und darin den Inhalt des Modells, so wie es das tut, wenn Sie mehrere Body-Parameter deklarieren, dann können Sie den speziellen Body-Parameter embed setzen:
Sie können mehrere Body-Parameter zu ihrer Pfadoperation-Funktion hinzufügen, obwohl ein Request nur einen einzigen Body enthalten kann.
FastAPI wird sich darum kümmern, Ihnen korrekte Daten in Ihrer Funktion zu überreichen, und das korrekte Schema in der Pfadoperation zu validieren und zu dokumentieren.
Sie können auch einzelne Werte deklarieren, die als Teil des Bodys empfangen werden.
Und Sie können FastAPI instruieren, den Body in einem Schlüssel unterzubringen, selbst wenn nur ein einzelner Body-Parameter deklariert ist.