Zum Inhalt

Schnelle API

Die Kombination von Ormar mit Fastapi ist ganz einfach .

Alles , was Sie tun müssen , abgesehen von der Verbindung mit der Datenbank beim Start , ist das pydantische Modell durch das ormar-Modell zu ersetzen .

Hier finden Sie eine sehr einfache Beispiel-Anwendungscode .

Warnung Dieses Beispiel nimmt an , dass Sie bereits eine Datenbank erstellt haben , wenn dies nicht der Fall ist , besuchen Sie den Abschnitt " Datenbankinitialisierung " .

!!!Die folgenden Beispiele (alle Teile) sollten in einer Datei abgelegt werden .

1
Es ist geteilt in Unterteilungen für die Clarität .

!!!Hinweis Wenn Sie mehr über die Verwendung des ormar-Modells in Fastapi-Anfragen und - Antworten erfahren möchten , lesen Sie das Dokument Antworten und Anforderungen .

schnellen Eintritt .

!!!Beachten Sie , dass Sie unter den Beispielen im GitHub-Repository ein vollständiges Schnellstartskript finden .

Import und Initialisierung

Verwenden Sie FastAPI-Lebenszyklusdefinitionen , um Programme zu starten und zu schließen , die in Ihrer Anwendung verwendet werden .

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from typing import list , Optional (Beispiel)

Importieren von Datenbanken
Import von Sqlalchemy
Import von FastAPI

Der Import von Ormar

from contextlib import asynccontextmanager aus dem Kontext importieren von asynccontextmanager
Import von FastAPI


@asynccontextmanager schreiben
async def lifespan (_ : FastAPI) - > AsyncIterator [ None ] : Async def lifespan (_ : FastAPI) - > AsyncIterator [ None ] :
    wenn nichtconfig.database.is_ Verbunden :
        await config . database . connect () (Dateiendung)

    und yield

    Wenn derconfig.database.is_ Verbunden :
        await config. database. disconnect () oder


Die Abbildung zeigt die Konfidenzintervalle für die Konfidenzintervalle (
    metadata = sqlalchemy. metadata (), oder
    database = databases. Database ("sqlite://test.db"),
)
app = FastAPI (lifespan = lifespan (base_ormar_config))(auf Englisch)

Info

Die Modelldefinition

Definieren Sie das ormar-Modell mit den entsprechenden Feldern.

Diese Modelle werden anstelle des pydantischen Modells verwendet.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
Die Datei ist in der Datei "_(
    Metathek = Metathek
    Datengrundlage = Datenbank
)


Klasse Kategorie (ormar. Modell):
    ormar_config = base_ormar_config. copy (tablename ="Kategorien")

    id: int = ormar. Integer (primary_key = true)(nicht bekannt)
    name: str = ormar. String (max_length = 100)


Klasse Item (ormar. Modell):
    ormar_config = base_ormar_config. copy ()(= Grundeinheit von Ormar_config. copy)

    id: int = ormar. Integer (primary_key = true)(nicht bekannt)
    name: str = ormar. String (max_length = 100)[Bearbeiten | Quelltext bearbeiten]
    Kategorie: Optional [Category]= ormar. ForeignKey (Category, nullable = True)

!!!Tipp Sie können mehr über das Definieren eines Modells im Abschnitt Modelle lesen.

Definition von Fastapi

Definieren Sie die Endpunkte, die Sie benötigen, und beachten Sie, wie das ormar-Modell sowohl als Antwort_model als auch als Anfrageparameter verwendet wird.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@ app. get ("/items/", response_model = List [Item])("/items/", response_model = Liste [Item]")
async def get _ items () () () : def get _ items () (auf Englisch)
    Items = Await (Übersicht)Item.objects.select_ related (" Kategorie ") . alle ()
    return Artikel


@app.post("/items/" , response _ model = Item) ("/items/" , Antwort _ Modell = Objekt ")
async def create _ item (item : Item) :
    Await istitem.save()
    return item Zurück


@app.post("/categories/" , response _ model = Category) ("/categories/" und response _ model = Category)
async def create _ category (Kategorie : Kategorie) :
    Await sehencategory.save()
    return Kategorie Zurück


@app.put ("/items/{item_id}") oder
async def get _ item (item _ id : int , item : Item) :
    item _ db = await Item . objects . get (pk = item _ id) [ Bearbeiten | Quelltext bearbeiten ]
    return await item _ db . update (* * item . model _ dump ()) [ Bearbeiten | Quelltext bearbeiten ]


@app . delete ("/items/xphbafox ") (oder "/items/{item_id}")
async def delete _ item (item _ id : int , item : Item = None) :
    Wenn dieser :
        return Zurück {"deleted_rows": await item.delete()}
    item _ db = await Item . objects . get (pk = item _ id) [ Bearbeiten | Quelltext bearbeiten ]
    return Zurück {"deleted_rows": await item_db.delete()}

!!!Beachten Sie , wie Ormar-Modellmethoden wie save () direkt nach der Initialisierung von fastapi für Sie verfügbar sind .

!!!Hinweis : Sie können direkt zu einem Modell (oder einer Modellliste) zurückkehren - fastapi wird es für Sie jsonize

Testen von Anwendungen

Arbeiten mit Fastapi

Wenn Sie dieses Skript ausführen und fastapi swagger verwenden möchten , installieren Sie zuerst uvicorn .

Pip Installation von Uvicorn

Starten Sie das Fastapi .

uvicorn <filename_without_extension>:app --reload

Sie können nun zu Ihrem Browser navigieren (standardmäßig lautet die Fastapi-Adresse 127.0.0.1:8000/docs) und die API verwenden .

!!!info Sie können mehr über das Ausführen von fastapi in der fastapi-Dokumentation lesen .

Testen mit Pytest

Hier ist ein Beispieltest , der beweisen wird , dass alles wie erwartet funktioniert .

Stellen Sie sicher , dass Sie zuerst eine Tabelle erstellen , wenn Sie pytest verwenden , können Sie ein Fixed-Gerät verwenden .

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@pytest . fixture (autouse = true , scope = " module ")@pytest . fixture (autouse = true , scope = " module ") und@pytest . fixture (auto = true , scope = " module ")
def create _ test _ database () (zum Beispiel) :
    engine = sqlalchemy . create _ engine (DATABASE _ URL) Bearbeiten
    metadata . create _ all (engl .) erstellen
    und yield
    metadata . drop _ all (englisch)



Hier ist ein Beispiel-Test , um die Arbeit des Ormars mit Fastapi zu überprüfen

von starlette . testclient import TestClient

def test _ all _ endpoints () : zum Beispiel :
    # Hinweis , dass TestClient nur sync ist , verwenden Sie hier keine ASYNs
    client = Testclient (App) Bearbeiten
    Hinweis : Sie müssen manuell eine Verbindung zur Datenbank herstellen .
    # oder verwenden Sie den Client als ContextManager während Tests
    Für Kunden als Kunden :
        Antwort =client.post("/categories/" , json ={"name": "test cat"}") oder "{"name": "test cat"}"
        Kategorie : Antwort (json)
        Antwort =client.post(
            "/items/" oder " json "{"name": "test", "id": 1, "category": category}
        )
        item = Item (* * Antwort . json ())
        Assert hinzufügenitem.pkist nicht keiner

        Antwort = Client . get ("/items/")
        Item = [ Item (* * item) für item in response . json () ]
        assert items [ 0 ] = item (Hinzufügen von Elementen)

        item.name = „ Neuer Name "
        Antwort = client . put (f "/items/{item.pk}" , json = item . model _ dump ())
        assert response . json () = item . model _ dump () () (= item . model _ dump ()) (= das _ _ ()

        Antwort = Client . get ("/items/")
        Item = [ Item (* * item) für item in response . json () ]
        assert items [ 0 ] . name = " Neuer Name "

        response = client . delete (f "/items/{item.pk}" , json = item . model _ dump ()) (" client . delete " (f "/items/{item.pk}" , json = item . model _ dump ()) (") ") ist ein
        get (" deleted _ rows " , " _ _ UNDEFINED _ _ ") ! = " _ _ UNDEFINED _ _ "
        Antwort = Client . get ("/items/")
        Antwort auf : json ()
        assert len (Punkte) = 0

!!!Tipp Wenn Sie mehr Testfälle sehen und ormar/fastapi testen möchten , lesen Sie das Testverzeichnis im github-Repository .

!!!info Sie können mehr über das Testen von fastapi in der fastapi-Dokumentation lesen .