ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • FastAPI
    카테고리 없음 2023. 10. 21. 09:48
    728x90

    설치

    FastAPI를 구동하기 위해선 다음과 같은 설치 과정이 필요하다,

    pip install fastapi
    
    pip install "uvicorn[standard]"

    fastapi는 fastAPI를 사용하기 위한 패키지, uvicorn은 구동 서버다.

    fastAPI 공식 문서에 나와있는 코드를 한번 보자.

    from typing import Union
    
    from fastapi import FastAPI
    
    app = FastAPI()
    
    
    @app.get("/")
    async def read_root():
        return {"Hello": "World"}
    
    
    @app.get("/items/{item_id}")
    async def read_item(item_id: int, q: Union[str, None] = None):
        return {"item_id": item_id, "q": q}

    위 코드는 비동기 프로그래밍을 적용한 것이다.

    * 'q: Union[str, None] = None' 의 의미는 q는 str 또는 None의 값을 가질 수 있으며, 지정하지 않으면 None 값을 가진다는 의미이다.

    main.py

    다음과 같은 환경에서 main.py를 만들어준다.

    $ uvicorn main:app --reload

    터미널에서 이 명령어를 실행시키게 되면

    다음과 같이 127.0.0.1 주소에 8000번 포트가 열리게 되며, 저 링크에 들어가면

    다음과 같이 기본값으로 지정한 json 응답이 나오게 된다.

    앞선 main.py에서 지정한 인자들에 값을 할당해 입력하게 되면 다음과 같은 json 응답이 나오게 된다.

    일례의 과정에서 다음의 규칙을 따르는 API가 만들어졌다.

    1. '/' 경로와 '/items/{item_id}' 경로에서 HTTP 요청을 받는다.

    2. 두 경로 모두 GET operation을 가진다.(HTTP Method)

    3. '/items/{item_id}' 경로는 int형의 item_id 파라미터를 가진다.

    4. '/items/{item_id}' 경로는 optional하게 str형의 query 파라미터 q를 가진다.

    /docs 경로에 들어가면 Swagger UI 환경에 내가 만든 FastAPI 문서 화면이 만들어진다.

    PUT 메서드

    다음과 같이 main.py의 코드를 수정해보자.

    from typing import Union
    
    from fastapi import FastAPI
    from pydantic import BaseModel
    
    app = FastAPI()
    
    
    class Item(BaseModel):
        name: str
        price: float
        is_offer: Union[bool, None] = None
    
    
    @app.get("/")
    def read_root():
        return {"Hello": "World"}
    
    
    @app.get("/items/{item_id}")
    def read_item(item_id: int, q: Union[str, None] = None):
        return {"item_id": item_id, "q": q}
    
    
    @app.put("/items/{item_id}")
    def update_item(item_id: int, item: Item):
        return {"item_name": item.name, "item_id": item_id}

    main.py 를 수정하면 서버가 바로 업데이트 되는데, 그 이유는 터미널에서 입력한 --reload가 uvicorn 서버에서 바로 업데이트를 하기 때문이다.

    아무튼 Item 객체를 선언하고, update_item 함수에 name과 item_id를 수정할 수 있게끔 하는 PUT 메서드를 만든다.

    문서에도 자동 반영된 것을 알 수 있다.

    FastAPI는..

    • item_id가 GET, PUT 요청 경로에서 유효한 인자인지 검사
    • item_id가 int형으로 입력이 되었는지 검사 : 그렇지 않으면 client는 Error 응답을 받는다
    • GET 메서드에서 optional 인자 query parameter q가 있는지 확인한다.
      • q = None으로 선언되어 있었기 때문에, optional 한 것이다.
      • None이 아니라면 required
    • PUT 요청이 들어오면 JSON 형식으로 body를 읽는다
      • name은 str 형인가?
      • price는 float 형인가?
      • is_offer는 bool 형인가?(존재한다면)
      • 이 모든 것은 깊게 얽힌 json 객체들로부터 작동한다
    • 응답을 빠르게 json으로 변환한다.
    • OpenAPI와 모든 문서는 상호작용하는 문서화 시스템과 자동 client 코드 생성 시스템을 만드는데 사용된다
    • 2개의 상호작용 Web UI 를 제공한다

     

    fastAPI는 다음과 같은 Pydantic에서 제공하는 Dependencies도 사용할 수 있다.

    마지막 문장에서도 나와있듯 pip install "fastapi[all]"로 하게 되면 모든 것들을 사용할 수 있다.

    728x90
Designed by Tistory.