728x90

fastapi에는 spring의 Interceptor와 같이 api호출 후 전/후처리를 할 수 있는 기능이 있습니다.

middleware를 적용하면 되는데

 

먼저 middleware/middleware.py를 생성해줍니다

from fastapi import Request
from chatterbot.utils import get_logger
import time

logger = get_logger(__name__)


class Middleware:
    def __init__(
            self,
            some_attribute: str,
    ):
        self.some_attribute = some_attribute

    async def __call__(self, request: Request, call_next):
        logger.debug("")
        logger.debug(" ******************** start ******************** ")
        logger.debug(" ***** request path : {} ".format(request.url.path))

        start_time = time.time()
        response = await call_next(request)
        process_time = time.time() - start_time
        response.headers["X-Process-Time"] = str(process_time)

        logger.debug(" ***** process_time : {} ".format(process_time))
        logger.debug(" ******************** end ******************** ")
        logger.debug("")

        return response

소스코드를 보시면 __call__함수가 있고, 그 안에서 
1. start_time 찍기
2. call_nest(request)호출
3. process_time찍기
순으로 실행을 하는데 이 과정을거쳐서 호출된 요청의 process_time을 찍을 수 있습니다.

 

await call_nest(reques)로 사용자가 요청하기 전에 전처리를 하고
응답값을 받아온 후에 후처리를 로직을 넣어서 구서을 하시면 됩니다.

 

 

이렇게 작성한 middleware를 router에 add해야하는데
main.py 소스에 아래부분을 추가하면 됩니다.

 

from middleware.middleware import Middleware
from starlette.middleware.base import BaseHTTPMiddleware

app = FastAPI()

middleware = Middleware(some_attribute="some_attribute_here_if_needed")
app.add_middleware(BaseHTTPMiddleware, dispatch=middleware)
728x90

파이썬으로 개발을 하다보면 pip를 이용해서 여러가지 모듈을 설치해서 사용을 하게 됩니다.

 

보통 개발을 하면서 필요한 모듈이 있으면 아래와 같은식으로 다운을 받은뒤
import를 해서 사용을 합니다.

 

pip install fastapi

 

하지만 한두개일때는 상관이 없지만 개발을 하다보면 20~30개의 모듈이 필요로 할 수 있기때문에

보통 requirements.txt파일을 이용해서 관리를 하는데 다운받을때마다 매번 추가를 해줄수 없기때문에

freeze를 사용해서 requirements.txt파일을 생성합니다.

 

 

가상환경에 설치된 리스트나 가상환경을 사용 안한다면 현재 사용중인 파이썬 버전에 설치된 리스트를
아래 명령어를 사용해서 txt파일을 생성 할 수 있습니다. 

 

pip freeze > requirements.txt

 

그리고 다른곳에서 해당 프로젝트를 실행하기 위해선 requirements.txt파일 들어있는 모듈들을 설치해야하는데
일일히 pip install A, pip install B이런식으로 설치를 각각 해줄수 있지만 20~30개 모듈을 하나하나 설치하는것 또한 쉽지 않기 때문에
아래 명령어를 통해 한번에 쭉 설치를 할 수 있습니다.

 

pip install -r requirementx.txt

 

728x90

FastAPI는 python용 웹프레임워크로 예전에 flask에서 많이 넘어오고 있는 중입니다.

 

공식문서에서는 아래와 같이 소개를 하고있습니다,

 

FastAPI는 현대적이고, 빠르며(고성능), 파이썬 표준 타입 힌트에 기초한 Python3.6+의 API를 빌드하기 위한 웹 프레임워크입니다.

주요 특징으로:

  • 빠름: (Starlette과 Pydantic 덕분에) NodeJS  Go와 대등할 정도로 매우 높은 성능. 사용 가능한 가장 빠른 파이썬 프레임워크 중 하나.
  • 빠른 코드 작성: 약 200%에서 300%까지 기능 개발 속도 증가. *
  • 적은 버그: 사람(개발자)에 의한 에러 약 40% 감소. *
  • 직관적: 훌륭한 편집기 지원. 모든 곳에서 자동완성. 적은 디버깅 시간.
  • 쉬움: 쉽게 사용하고 배우도록 설계. 적은 문서 읽기 시간.
  • 짧음: 코드 중복 최소화. 각 매개변수 선언의 여러 기능. 적은 버그.
  • 견고함: 준비된 프로덕션 용 코드를 얻으십시오. 자동 대화형 문서와 함께.
  • 표준 기반: API에 대한 (완전히 호환되는) 개방형 표준 기반: OpenAPI (이전에 Swagger로 알려졌던) 및 JSON 스키마.

* 내부 개발팀의 프로덕션 애플리케이션을 빌드한 테스트에 근거한 측정

 

FastAPI를 쓰면 swagger도 포함이 되어있어서 docs를 쉽게 볼수 있고. 파이썬 기반 api서버 구축하기 아주 좋은 프레임워크입니다.

 

우선 사용하기위하 아래 명령어로 설치를 해줍니다

pip install fastapi

그리고 서버를 띄우기 위해 ASGI서버도 필요하기 떄문에 같이 설치를 해줍니다

pip install uvicorn[standard]

 

그다음 파이썬 프로젝트에서 main.py를 생성해줍니다.

main.py의 내용은 아래와 같습니다

from typing import Union
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"Hello": "World"}

작성을 했으면 main.py가 있는 위치에서 아레 명령어를 입력해 실행시킵니다.

uvicorn main:app --reload

INFO: Application startup complete. 

메세지가 뜨면
http://localhost:8000/

에 접속을 합니다. 그러면  브라우저에 {"Hello": "World"}이 출력된걸 볼수 있습니다

 

http://localhost:8000/docs에 접속하면 swagger ui api문서도 바로 볼수 있습니다.

 

 

 

728x90

SQLAlchemy QueuePool life cycle

SqlAlchemy - create_engine() parameter

  • create_engine(DATABASE_URL, pool_size=10, pool_recycle=500, ...) 식으로 설정값 세팅
    • convert_unicode : True 설정하면 String 기반의 모든 column 값을 python unicode object 수용할 있는 값으로 변환
    • pool_size : 연결할 수 있는 connection의 크기를 지정
    • pool_recycle :
      • 초단위로 설정값 이후에 connection재사용
      • mysql 타임아웃이 100초일때 100초보다 작게 세팅해놓으면 mysql에서 강제로 끊는 현상을 막을 수 있음
    • max_overflow : 허용된 connection 수 이상이 들어왔을 때, 최대 얼마까지 추가로 허용
    • pool_pre_ping : (SELECT 1)을 날려서 커넥션 확인 후 연결
    • echo: True시 로그남김

+ Recent posts