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 .
| 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)
|
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 .