Blue Chicken - The Legend Of Zelda
본문 바로가기

개인공부

FAST API 사용

아래 매뉴얼을 보고 FAST API를 사용해보기로 한다.

https://fastapi.tiangolo.com/ko/

FAST API는 Python3.7+ 에서 지원되며 웹 부분에서 Starlette, 데이터 부분에서 Pydantic을 사용하는 것이 좋다고 한다.

 

1. 파이썬을 설치한다..

https://www.python.org/downloads/ 에서 3.11.4 로 설치하겠음

설치할때 뜨는 환경변수에 추가 하겠느냐는 질문에 체크해서 자동 추가 되도록 설정함

경로 : C:\Users\baek\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Python 3.11

 

 

2. Starlette(스타렛)을 설치한다. vsCode에서 https://www.starlette.io/ 에 적힌 example.py 파일 만들었더니 Python 깔라 해서 깔았음

2. 웹에 도움되는 모니터링 기능을 가진 Starlette을 깔기 위해 pip3 install starlette 명령어 실행

3. ASGI 서버를 위해 pip3 install uvicorn 명령어로 uvicorn 을 설치

*ASGI(비동기 서버 게이트웨이 인터페이스) : 웹 서버, 프레임워크, 응용프로그램들의 호환성 표준

4. example.py를 작성하고 uvicorn example:app 명령어를 통해 실행

from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route


async def homepage(request):
    return JSONResponse({'hello': 'world'})


app = Starlette(debug=True, routes=[
    Route('/', homepage),
])

아래 화면이 뜬다.

5. pydantic 설치 https://weekwith.tistory.com/entry/Pydantic-%EC%84%A4%EC%B9%98

pip install pydantic 명령어로 설치

 유효성 검사 규칙을 위반하는 경우, Pydantic은 예외를 발생시킵니다.

참고 : https://python101.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Pydantic-%EC%82%AC%EC%9A%A9%EB%B2%95

아마도 아래처럼... 알려준다는 것 같음

 

6. fastApi 설치, 이제 드디어 pip install fastapi 명령어로 설치

7. main.py를 작성하고 uvicorn main:app --reload 명령어로 실행시킨다.

아까꺼랑 구분하려고 Thisismain 문구로 변경했더니 아래와 같이 변경된다.

 http://127.0.0.1:8000/docs 에서는 자동 대화형 api를 볼 수 있다.

http://127.0.0.1:8000/redoc 에서도 다른 자동 문서를 볼 수 있다.

8. 코드를 좀 변경한 후에  http://127.0.0.1:8000/docs 접속하면 이렇게 세 개 있고

 

열면 Try it out 버튼이 있음 저거 누르면

text 창이 활성화 됨 그래서 데이터를 작성하고 Excute를 누르면 (일단 임시 데이터를 넣었다.)

아래에 실행 정보가 뜬다.

Curl로 돌리면 이런식, Request URL은 이런식, json은 이런식.. 등등.. 제대로 된 정보라 200번이 뜬 것까지!

PUT도 마찬가지~~

스키마에서는 내가 작성한 모델 확인 가능


FastAPI의 문서화 UI는 ReDoc 및 Swagger UI(api문서를 시각적으로 표현, 사용자가 실제로 api 엔드포인트를 웹 브라우저에서 테스트 할 수 있게 해주는 도구)를 기반이다. "Authorize" 버튼은 Swagger UI에 내장된 기능으로, OAuth2 및 다른 인증 메커니즘이 API에 적용되어 있을 경우 해당 버튼을 통해 인증 작업을 수행, "Authorize" 버튼을 사용하여 Swagger UI에서 인증 정보를 입력하면, 단순히 Swagger UI의 현재 세션에서만 유지

 

Swagger UI의 "Authorize" 버튼은 사용자가 API 문서 내에서 인증 절차를 거치게 해준다. 이렇게 하면 사용자는 Swagger UI를 통해 인증이 필요한 엔드포인트를 직접 테스트하거나 사용할 수 있다.

예를 들어, FastAPI와 같은 프레임워크에서 OAuth2나 JWT (JSON Web Token)와 같은 인증 방법을 사용하고 있을 때, 사용자는 "Authorize" 버튼을 클릭하여 필요한 인증 정보 (예: API 키, 사용자 이름 및 비밀번호, Bearer Token 등)를 제공하게 됩니다.

이 정보를 제공하고 "Authorize"를 완료하면, 이후 Swagger UI 내에서 인증이 필요한 엔드포인트를 호출할 때 마다 해당 인증 정보가 자동으로 포함되어 요청된다. 이를 통해 개발자는 문서 내에서 인증 절차를 거치지 않고도 인증이 필요한 엔드포인트의 동작을 테스트해볼 수 있다.

단, "Authorize" 버튼을 통한 인증은 Swagger UI 내의 세션 동안만 유효하며, 브라우저를 닫거나 다시 로드하면 인증 세션이 종료될 수 있다.

로그인 가능

번외 : 아래 코드에 대한 설명

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":"Thisismain"}

@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}

FastAPI의 처리

1. GET 및 PUT 요청에 ITEM_ID가 경로에 있는지 검증

2. GET 및 PUT 요청에 ITEM_ID가 int 타입인지 검증

    - 그렇지 않다면 클라이언트는 유용하고 명확한 에러를 볼 수 있다.

3. GET 요청에 q라는 선택적인 쿼리 매개변수(파라미터)가 있는지검증

    - q 매개변수는 =None으로 선언되었기 때문에 선택사항

    - None이 없다면 필수사항, PUT의 경우와 마찬가지

4. /items/{item_id}으로의 PUT 요청은 본문을 JSON으로 읽음

    - name을 필수 속성으로 갖고 str형인지 검사

    - price를 필수 속성으로 갖고 float형인지 검사

    - 만약 주어진다면, is_offer를 선택 속성으로 갖고 bool형인지 검사

    - 이 모든 것이 깊이 중첩된 JSON 객체에도 적용됩니다.

5. JSON을 변환하거나 JSON으로 변환하는 것을 자동화

6. 다음에서 사용할 수 있는 모든 것을 OpenAPI로 문서화

    - 대화형 문서 시스템

    - 여러 언어들에 대한 자동 클라이언트 코드 생성 시스템

7. 2개의 대화형 문서 웹 인터페이스를 직접 제공

 

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("/")   #1. RestAPI가 GET 및 PUT 요청에 ITEM_ID가 경로에 있는지 검증
def read_root():
    return {"Hello":"Thisismain"}

@app.get("/items/{item_id}") #2. GET 및 PUT 요청에 ITEM_ID가 int 타입인지 검증
def read_item(item_id : int, q : Union[str, None] = None): #3. GET 요청에 q라는 선택적인 쿼리 매개변수(파라미터)가 있는지검증
    return {"item_id":item_id, "q":q}

@app.put("/items/{item_id}") #4. /items/{item_id}으로의 PUT 요청은 본문을 JSON으로 읽음
def update_item(item_id : int, item : Item) :
    return {"item_name" : item.name, "item_id" : item_id}

#5. JSON을 변환하거나 JSON으로 변환하는 것을 자동화
#6. 대화형 문서 시스템, 여러 언어들에 대한 자동 클라이언트 코드 생성 시스템에서 사용할 수 있는 모든 것을 OpenAPI로 문서화
#7. 2개의 대화형 문서 웹 인터페이스를 직접 제공

 

 

'개인공부' 카테고리의 다른 글

도커 컴포즈에서는 이미 돌아간 컨테이너 삭제 어려운가 보다.  (0) 2023.07.21
NoSQL  (1) 2023.07.13
WSGI와 ASGI  (0) 2023.07.11
REST API, FAST API  (1) 2023.07.10
8월 28일~ 새노트북 개발환경 설치기행  (0) 2022.09.03