FastAPI Souce: https://github.com/tiangolo/fastapi FastAPI Document: https://fastapi.tiangolo.com
Ziel: Abfrageparameter
Hinweise zum FastAPI-Tutorial. Grundsätzlich beziehe ich mich auf das offizielle Tutorial von Fast API, aber ich lasse einige Teile weg oder ändere die Reihenfolge für mein eigenes Lernen. Die korrekten und detaillierten Informationen finden Sie in der offiziellen Dokumentation.
Da ich ein Anfänger von Web & Python bin und mich bei der Übersetzung auf Google und DeepL verlasse, würde ich mich freuen, wenn Sie auf Fehler hinweisen könnten.
Klicken Sie hier für vorherige Notizen
Ubuntu 20.04 LTS Python 3.8.2 pipenv 2018.11.26
Intro Beim letzten Mal (FastAPI Tutorial Memo Teil 2 Pfadparameter) haben Sie gelernt, wie Sie ** Pfadparameter ** als Funktionsparameter übergeben. Dieses Mal möchte ich lernen, wie man ** Abfrageparameter ** übergibt.
Wenn Sie in FastAPI einen Parameter deklarieren, der kein Pfadparameter als Argument einer Funktion ist, wird er automatisch als ** Abfrageparameter ** interpretiert. Überprüfen Sie den folgenden Code.
main.py
from fastapi import FastAPI
app = FastAPI()
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10): # <-Der Parameter Query wird angegeben.
return fake_items_db[skip : skip + limit]
In HTTP-URIs werden ** Abfragen ** im Wesentlichen durch Verbinden von "Schlüssel" - und "Wert" -Paaren ausgedrückt, die auf "?" Mit "=" folgen. Wenn Sie mehr als eine angeben, trennen Sie die URIs mit "&". Wenn Sie beispielsweise mit dem obigen Code übereinstimmen möchten, wird die folgende URL angenommen:
http://127.0.0.1:8000/items/?skip=0&limit=10
Der ** Abfrageparameter ** ist in diesem Fall
--skip
mit einem Wert von 0
Werden an die Funktion übergeben.
Da diese Teil der URL sind, sollten sie normalerweise als Zeichenfolgen (str
) interpretiert werden.
Im obigen Code wird ein Parameter beim Angeben als Argument mit dem Python-Typ "int" deklariert, sodass der Parameter konvertiert und in den Typ "int" verifiziert wird.
Dies bedeutet, dass die folgenden Vorteile, die mit dem Parameter ** Path ** angewendet werden, auch für den Parameter ** Query ** gelten.
Diese Vorteile werden nicht nur von Pfad und Abfrage unterstützt, sondern auch von verschiedenen Parametern, die von Fast API verarbeitet werden.
Der Parameter ** Abfrage ** wird nicht durch den Pfad des URI festgelegt, sondern ist eine optionale Einstellung, sodass ein Standardwert angegeben werden kann.
Im obigen Code können Sie sehen, dass "skip = 0" und "limit = 10" als Standardwerte angegeben sind. Daher eine solche URL:
http://127.0.0.1:8000/items/
Beim Zugriff über einen Browser
http://127.0.0.1:8000/items/?skip=0&limit=10
Die beiden oben genannten URLs haben dieselbe Ausgabe.
Zum Beispiel auch die folgende URL:
http://127.0.0.1:8000/items/?skip=20
Wenn Sie auf zugreifen, lauten die Funktionsparameter:
--skip = 20
in URL gesetzt
limit = 10
Optional parameters Es ist auch möglich, ** Abfrageparameter ** zu deklarieren, die als Optionen verwendet werden können, indem der Standardwert auf "Keine" gesetzt wird. Überprüfen Sie als Beispiel den folgenden Code.
main.py
from typing import Optional #Importieren Optional vom Eingeben des Pakets
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None): #Parameter abfragen"q"Wird als optionaler Parameter deklariert
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}
In diesem Fall wird der Funktionsparameter "q" als Option und standardmäßig als "Keine" behandelt.
Beachten Sie, dass die Fast-API jetzt versteht, dass item_id
ein ** Pfadparameter ** und q
ein ** Abfrageparameter ** anstelle eines ** Pfadparameters ** ist. ..
Außerdem erkennt die Fast-API, dass "q" ein optionaler Parameter ist, indem sie "= None" deklariert. "Optional" wird von der Fast-API selbst nicht verwendet. Der Zweck der expliziten Angabe, dass es optional als "Optional [str]" ist, besteht darin, dass die Unterstützung des Editors den Fehler im Voraus erkennen kann.
Sie können den Typ "bool" als ** Abfrageparameter ** deklarieren. In diesem Fall konvertiert die Fast API den Parameter in das entsprechende Formular. Überprüfen Sie als Beispiel den folgenden Code.
main.py
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
#Der Bool-Typ wird im Abfrageparameter des Arguments angegeben
async def read_item(item_id: str, q: Optional[str] = None, short: bool = False):
item = {"item_id": item_id}
if q:
item.update({"q": q})
if not short:
item.update(
{"description": "This is an amazing item that has a long description"}
)
return item
Für einen solchen Code können Sie wie folgt darauf zugreifen:
http://127.0.0.1:8000/items/foo?short=1
http://127.0.0.1:8000/items/foo?short=True
http://127.0.0.1:8000/items/foo?short=true
http://127.0.0.1:8000/items/foo?short=on
http://127.0.0.1:8000/items/foo?short=yes
Für diese URLs werden alle Parameter "short" als "True" mit einem "bool value" behandelt. (Gleiches gilt auch dann, wenn der erste Buchstabe von unten nach oben geändert wird.) Wenn der Wert nicht dem oben genannten Wert entspricht, ist er "False". Auf diese Weise wird die Konvertierung von der Fast-API durchgeführt, wenn Sie den Bool-Typ im Parameter ** Query ** angeben.
In FastAPI funktioniert es auch dann einwandfrei, wenn Sie mehrere ** Pfadparameter ** und ** Abfrageparameter ** gleichzeitig mit Funktionsargumenten deklarieren. Sie müssen sie auch nicht in einer bestimmten Reihenfolge deklarieren. Dies liegt daran, dass FastAPI Parameter anhand des Namens erkennt.
Wenn Sie beispielsweise folgenden Code haben:
main
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{user_id}/items/{item_id}") # <- {user_id}Wann{item_id}をPathパラメータWannして指定
async def read_user_item(
user_id: int, item_id: str, q: Optional[str] = None, short: bool = False # <-Kein Pfadparameter"q"Wann"short"はQueryパラメータWannして扱う
):
item = {"item_id": item_id, "owner_id": user_id}
if q:
item.update({"q": q})
if not short:
item.update(
{"description": "This is an amazing item that has a long description"}
)
return item
In diesem Fall gibt es kein Problem, auch wenn die Reihenfolge der Funktionsargumente geändert wird. FastAPI erkennt jeden Parameter anhand des Namens des Parameters.
Wenn Sie einen Standardwert mit einem anderen Parameter als Path deklarieren (obwohl Sie derzeit nur Abfrageparameter lernen), ist dieser Parameter kein obligatorischer Parameter mehr. Dies liegt daran, dass der Standardwert angegeben wird, wenn der Parameter weggelassen wird.
Sie können einen Parameter auch als optionalen Parameter deklarieren, ohne einen bestimmten Wert hinzuzufügen, indem Sie den Standardwert auf "Keine" setzen.
Was Sie dann tun müssen, wenn Sie ** Abfrageparameter ** als unverzichtbaren wesentlichen Parameter festlegen möchten, können Sie erreichen, indem Sie den Standardwert nicht deklarieren.
main
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_user_item(item_id: str, needy: str): # <-Deklarieren des Parameters Needley ohne Angabe eines Standardwerts
item = {"item_id": item_id, "needy": needy}
return item
Der obige Parameter needy
wird als erforderlicher str
-Typ ** Abfrageparameter ** deklariert.
Wenn Sie eine URL wie diese haben:
http://127.0.0.1:8000/items/foo-item
Wenn Sie das in einem Browser öffnen, wird der folgende Fehler angezeigt, da der erforderliche Parameter needy
nicht hinzugefügt wurde.
{
"detail": [
{
"loc": [
"query",
"needy"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}
needy
ist ein erforderlicher Parameter, daher müssen Sie ihn in der folgenden URL angeben:
http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
Diese URL sollte folgendermaßen aussehen:
{
"item_id": "foo-item",
"needy": "sooooneedy"
}
Natürlich ist es möglich, gleichzeitig erforderliche Parameter, Parameter mit Standardwerten und optionale Parameter zu definieren.
main
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_user_item(
item_id: str, needy: str, skip: int = 0, limit: Optional[int] = None # <-
):
item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit}
return item
Im obigen Code werden drei Abfrageparameter deklariert.
--needy
: Erforderlicher Parameter vom Typ str
(ohne Standardwert)
-- skip
: Ein Parameter vom Typ int
mit dem Standardwert 0
--limit
: Optionaler Parameter vom Typ int
Sie können "Enum" mit ** Abfrageparameter ** sowie ** Pfadparameter ** verwenden. Weitere Informationen finden Sie unter Pfadparameter.
Dieses Mal habe ich gelernt, wie man den Parameter ** Query ** verwendet. Der gesamte in diesem Artikel verwendete Code stammt aus der offiziellen Dokumentation (https://fastapi.tiangolo.com/tutorial/query-params/). Ich habe bestätigt, dass es in meiner lokalen Umgebung funktioniert.
Nächstes Mal werden wir ** Request Body ** studieren.
Recommended Posts