[PYTHON] FastAPI Tutorial Memo Teil 3 Abfrageparameter

Einführung

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

Entwicklungsumgebung

Ubuntu 20.04 LTS Python 3.8.2 pipenv 2018.11.26

Ziel

Verfahren

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.

Standardeinstellungen

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

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.

Konvertierung des Abfrageparametertyps

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:

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.

Mehrere Pfad- und Abfrageparameter

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.

Erforderliche Abfrageparameter

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.

Am Ende

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

FastAPI Tutorial Memo Teil 3 Abfrageparameter
FastAPI Tutorial Memo Teil 2 Pfadparameter
FastAPI Tutorial Memo Teil 1
Django Tutorial Memo
[Für Memo] Linux Teil 2
Listen Sie das Schreiben von Memos Teil 2 auf
Python-Grundnotiz - Teil 2
Python OpenCV Tutorial Memo
Python-Grundnotiz - Teil 1
Android HCE Survey Memo (Teil 2)
Pyramide Tutorial Memo (Bankkonto)
Power Query Technique Collection Teil 1
Abfrageparameter für Flask GET abrufen
Linux Standard Lehrbuch Memo 1 Teil 2
Python-Grammatik-Grundnotiz (1)
Linux Standard Lehrbuch Memo Teil 6