Быстрый API
Использование Ormar и Fastapi очень просто.
Все, что вам нужно сделать, кроме подключения к базе данных при запуске, это заменить Pydantic моделью на ormar.
Здесь вы можете найти очень простой пример кода приложения.
!!! Предупреждение Этот пример предполагает, что вы создали базу данных. Если это не так, посетите раздел инициализации базы данных.
!!!tip Примеры (все части) должны быть помещены в один файл.
| It's Divided Into subsections for clarity.
|
!!!note Если вы хотите узнать больше о том, как использовать модель ormar в запросах и ответах fastapi, обратитесь к документации по ответам и запросам.
Быстрое открытие
!!!note Обратите внимание, что вы можете найти полный скрипт быстрого запуска в примере репозитория github.
Импорт и инициализация.
Использование жизненного цикла FastAPI для определения запуска и закрытия программ и их использования в приложениях.
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 | Из списка импорта, опциональный
Import Data abases
Sqimport alchemy
Fastapi import FastAPI
import ormar
Из contextlib import asynccontextmanager
Fastapi import FastAPI
Asynccontextmanager
async def lifespan (_: FastAPI)-> AsyncIterator [None]:
if not www.example.com_connected:
wait config. database.connect ()
Yield
if www.example.com_connected:
await config.database.disconnect()
«Органа»((
metadata= sqalchemy (),
Database=databases.Database("sqlite://test.db")
)
app = FastAPI(lifespan=lifespan(base_ormar_config))
|
Определение модели
Определите модель ormar с помощью соответствующих полей.
Эти модели будут использоваться вместо Pydantic.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | Bays_ormar_config (
metadata = metadata
database = база данных
)
Категория (Ormar.Model):
ormar_config = base_ormar_config.copy (tablename="categories")
id: int = ormar.Integer(primary_key =True)
name: str = ormar.String(max_length =100)
class Item(ormar.Model):
ormar_config = base_ormar_config ()
id: int = ormar.Integer(primary_key =True)
name: str = ormar.String(max_length =100)
Категория: Optional[Категория] = ormar.ForeignKey(Категория, nullable=True)
|
!!!Запрос на получение дополнительной информации об определении модели в разделе "Модель".
Определение конечной точки Fastapi
Определите желаемую конечную точку и обратите внимание на то, как модель ormar используется в качестве модели response_model и параметра запроса.
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 | ap.get ("/items/", response_model =List[Item])
async def get_items ():
items = await Item.objects.select ("category").all(
Return items
app.post ("/items/", response_model =Item)
async def create_item (item: Item):
item.save (
Возвращение item
app.post ("/categories/", response_model = Категория)
async def create_category (категория: Category):
category.save (
Возвращение к категории
put("/items/{item_id}")
async def get_item (item_id: int, item: Item):
item_db = await Item. objects.get (pk= item_id)
return await item_db.update(**item. model_dump ())
delete("/items/{item_id}")
async def delete_item (item_id: int, item: Item = None):
if item:
Возвращение {"deleted_rows": await item.delete()}
item_db = await Item. objects.get (pk= item_id)
Возврат {"deleted_rows": await item_db.delete()}
|
!!!note Обратите внимание на то, как методы модели ormar, такие как save(), становятся доступными непосредственно после инициализации fastapi для вас.
!!!Примечание Обратите внимание, что вы можете напрямую вернуть модель (или список моделей)- fastapi будет для вас использовать его jsonize
Тестирование приложений
Запуск fastapi
Если вы хотите запустить этот скрипт и сначала установить uvicorn с помощью fastapi swagger
Pip установка uvicorn
Запустить Fastapi.
uvicorn <filename_without_extension>:app --reload
Теперь вы можете перейти в браузер (адрес fastapi по умолчанию 127.0.0.1: 8000/docs) и использовать api.
!!!info Вы можете прочитать больше информации о запуске fastapi в документации по fastapi.
Тестирование с помощью Pytest
Вот пример теста, который покажет, что все работает так, как ожидалось.
Сначала обязательно создайте таблицу. Если вы используете pytest, вы можете использовать стационарные устройства.
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")
create def_test_database ():
engine = sqlalchemy.create_engine (DATABASE)
metadata. create_all (engine)
Yield
metadata.drop_all (engine)
# here is a sample test to check the working of the ormar with fastapi
Testclient Import TestClient
def test_all_endpoints ():
# note that Client Testis only sync, Don't use asyns here
Client = TestClient(приложение)
# note that you need to connect to database manually
# or use client as contextmanager tests
С клиентом:
Response = client.post ("/categories/", json={"name": "test cat"})
Категория = response.json ()
1998 - client.post годы:
"/items/", Json={"name": "test", "id": 1, "category": category}
)
item = Item(** response.json ())
item.pk is not None
Response = client.get ("/items/")
items = [Item(**item) for item in response.json()]
[0] = item
item.name = "Новое имя"
response = client.put (f"/items/{item.pk}", json=item. model_dump ())
assert respons.json () = item. model_dump ()
response = client.get ("/items/")
items = [Item(**item) for item in response.json ()]
assert items[0].name = "New name"
response = client.delete (f"/items/{item.pk}", json=item. model_dump ())
assert respons.json ().get("deleted_rows", "__UNDEFINED__") != "__UNDEFINED__"
response = client.get ("/items/")
Рецепт = response json()
assert len(items) = 0
|
!!!Если вы хотите узнать больше о тестировании и о том, как тестировать ormar/fastapi, см. каталог тестов в репозитории github.
!!!info Вы можете прочитать больше информации о тестировании fastapi в документации по fastapi.