콘텐츠로 이동

빠른 API

Ormar와 FastAPI를 결합하는 것은 매우 간단합니다.

시작할 때 데이터베이스에 연결하는 것 외에도 Pydantic 모델을 Ormar 모델로 교체하기만 하면 됩니다.

여기에서 매우 간단한 예제 응용 프로그램 코드를 찾을 수 있습니다.

!!! 경고 이 예에서는 이미 데이터베이스를 생성했다고 가정합니다. 그렇지 않은 경우 데이터베이스 초기화 섹션을 방문하십시오.

!!!다음 예제(모든 부품)는 하나의 파일에 배치해야 합니다.

1
명확성을 위해 하위 섹션으로 나뉩니다.

!!!참고 FastAPI 요청 및 응답에서 Ormar 모델을 사용하는 방법에 대해 자세히 알아보려면 응답 및 요청 문서를 확인하십시오.

빠른 시작

!!!github 리포지토리의 예에서 전체 빠른 시작 스크립트를 찾을 수 있습니다.

가져오기 및 초기화

빠른 API 수명 주기를 사용하여 시작 및 종료 프로그램을 정의하고 응용 프로그램에서 사용합니다.

 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
입력 가져오기 목록, 선택 사항

데이터베이스 가져오기
sqlalchemy 가져오기
빠른 API에서 빠른 API 가져오기

오마르 가져오기

컨텍스트 립에서 비동기 컨텍스트 관리자 가져오기
빠른 API에서 빠른 API 가져오기


@async 매니저
Async def 수명(_: FastAPI) -> AsyncIterator [없음]:
    구성하지 않은 경우.ase.is_:
        구성을 기다립니다.데이터베이스.연결()

    수율

    구성된 경우.ase.is_:
        구성을 기다립니다. 데이터베이스 연결 끊기 ()


base_ormar_config = ormar. OrmarConfig (
    메타데이터 = sqlalchemy. 메타데이터(),
    데이터베이스 = 데이터베이스. 데이터베이스("sqlite://test.db"),
)
앱 = FastAPI(수명 = 수명(base_ormar_config))

!!!정보 api 문서에서 데이터베이스 연결에 대한 자세한 내용을 읽을 수 있습니다.

모델 정의

적절한 필드를 사용하여 ormar 모델을 정의합니다.

이러한 모델은 Pydantic 모델 대신 사용됩니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
base_ormar_config = OrmarConfig (
    메타데이터 = 메타데이터
    데이터베이스 = 데이터베이스
)


클래스 카테고리(ormar. 모델):
    ormar_config = base_ormar_config (테이블 이름 = "카테고리")

    ID: int = ormar. 정수(prial_key = 참)
    이름: str = ormar. 문자열(max_long = 100)


클래스 항목(ormar. 모델):
    ormar_config = base_ormar_config 사본()

    ID: int = ormar. 정수(prial_key = 참)
    이름: str = ormar. 문자열(max_long = 100)
    카테고리: 옵션 [카테고리] = ormar. 외래 키(카테고리, nullable = True)

!!!팁 모델 섹션에서 모델 정의에 대한 자세한 내용을 읽을 수 있습니다.

빠른 API 엔드포인트 정의

ormar 모델이 응답 _ 모델 및 요청 매개 변수로 사용되는 방법에 주목하여 필요한 엔드포인트를 정의합니다.

 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 ("//", _Model = 목록 [항목])
Async def get_ ():
    항목 = 대기 항목 선택_관련("카테고리") .all()
    반품 아이템


@app.post("//", _Model = 항목)
Async def create_ 항목(항목: 항목):
    기다려item.save()
    반품 아이템


@app.post("//", _Model=ory)
Async def create_(카테고리: 카테고리):
    기다려category.save()
    반품 카테고리


@App.put ("//{item_id}")
Async def get_ 항목(item_id: int, 항목: 항목):
    item_db = 기다려 Item.ts.get (pk = item_id)
    반환 대기 항목_db(** item.model_dump())


@ 앱.삭제("//{item_id}")
Async def delete_항목(item_id: int, 항목: 항목 = 없음):
    항목이 있는 경우:
        반품 {"deleted_rows": await item.delete()}
    item_db = 기다려 Item.ts.get (pk = item_id)
    반품 {"deleted_rows": await item_db.delete()}

!!!FastAPI가 초기화한 후 저장()과 같은 ormar 모델 방법을 직접 사용할 수 있는 방법에 유의하십시오.

!!!모델(또는 모델 목록)을 직접 반환할 수 있습니다. FastAPI가 당신을 위해 그것을 jsonized 할 것입니다.

응용 프로그램 테스트

빠른 실행API

이 스크립트를 실행하고 Fastapi swagger를 사용하려면 먼저 uvicorn을 설치하십시오.

Pip 설치 uvicorn

그리고 FastAPI를 시작합니다.

uvicorn <filename_without_extension>:app --reload

이제 브라우저로 이동하여(기본적으로 Fasapi 주소가 127.0.0.1:8000/docs) api를 사용할 수 있습니다.

!!!정보 FastAPI 설명서에서 FastAPI 실행에 대한 자세한 내용을 읽을 수 있습니다.

파이테스트로 테스트

다음은 모든 것이 예상대로 작동한다는 것을 증명하는 샘플 테스트입니다.

먼저 테이블을 만드십시오. pyest를 사용하는 경우 고정장치를 사용할 수 있습니다.

 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.ture (자동 = 참, 범위 = "모듈")
Def create_test_ ():
    엔진 = sqlalChemy.create_ (DATABASE_URL)
    create_all (엔진)
    수율
    drop_all(엔진)



# 여기 파파피로 오르마의 작동을 확인하기 위한 샘플 테스트가 있습니다.

Starlette.testClient에서 TestClient 가져오기

Def test_all_endpoint():
    # TestClient는 동기화만 가능합니다. 여기서 asyns를 사용하지 마십시오.
    클라이언트 = TestClient (앱)
    # 데이터베이스에 수동으로 연결해야 합니다.
    # 또는 테스트 중에 클라이언트를 컨텍스트 관리자로 사용
    클라이언트를 클라이언트로 사용:
        응답=client.post("/카테고리/", json={"name": "test cat"})
        카테고리 = 응답.json ()
        응답=client.post(
            "/항목/", json ={"name": "test", "id": 1, "category": category}
        )
        항목 = 항목(** 응답.json())
        item.pk 없음이 아니라고 주장

        응답 = client.get ("//")
        항목 = [응답 항목에 대한 항목(** 항목).json()]
        주장된 항목 [0] == 항목

        item.name= "새 이름"
        응답 = client.put (f " / /{item.pk}", json = item. model_dump ())
        응답을 주장하십시오. json () == item.model_dump ()

        응답 = client.get ("//")
        항목 = [응답 항목에 대한 항목(** 항목).json()]
        주장 항목 [0]. 이름 == "새 이름"

        응답 = 클라이언트.삭제 (f"//{item.pk}", json = 항목. model_dump ())
        응답을 주장하십시오. json ().get ("ed_row", "__UNDEFINED__")! = "__UNDEFINED__"
        응답 = client.get ("//")
        항목 = 응답.json ()
        주장 렌 (항목) ==0

!!!팁 더 많은 테스트 사례와 ormar/astapi 테스트 방법을 보려면 github 저장소의 테스트 디렉토리를 참조하십시오.

!!!정보 FastAPI 문서에서 FastAPI 테스트에 대한 자세한 내용을 읽을 수 있습니다.