fastapi 12

FastAPI 의 jsonable_encoder 들여다보기

jsonable_encoder 이란? FastAPI 에서 제공하는 인코더 함수로, 보통은 클라이언트로 전송하기 전에 응답하는 객체를 json 으로 인코딩할 수 있도록 변환해 주는 역할을 합니다. (참고로 json 으로 변환해 주는 것은 아닙니다!) 실제로 FastAPI 는 jsonable_encoder 를 어떻게 사용할까요? 아래 코드는 요청이 유효하지 않을 때 에러를 응답하는 함수입니다. # fastapi.exception_handlers.py async def request_validation_exception_handler( request: Request, exc: RequestValidationError ) -> JSONResponse: return JSONResponse( status_code=..

네이버 클라우드 플랫폼(NCP)으로 Python 서버 배포하기

이 글은 FastAPI 로 구현된 Python 서버를 네이버 클라우드 플랫폼(이하 NCP)으로 마이그레이션 한 후기입니다. 들어가기 전에 저는 현재 글또 9기 운영진으로 지난 8 기서부터 또봇이라고 하는 슬랙 앱(봇)을 만들어 운영하고 있습니다. 처음 또봇을 클라우드 환경에서 배포할 때에는 `클라우드 타입`이라는 호스팅 서비스를 이용했는데요. 클라우드 타입은 클릭 몇 번으로 아주 간편하게 서버 배포를 해주는 호스팅 서비스입니다. 게다가 무료죠(였죠) 약 1년 동안 잘 사용하던 클라우드 타입이 이번 12월 부터 유료화를 도입했고, 기존 무료 호스팅은 하루 1번 강제 종료라는,, 아주 크리티컬 한 제약이 추가되었습니다. ㅠㅠ 저는 서버가 강제종료되기 전에 서둘러 다른 클라우드 서비스를 찾기 시작했습니다. 그..

Python & FastAPI 로 백엔드 시작하기 (2) _ API 연습 및 단축 스크립트 만들기

02. API 연습 및 단축 스크립트 만들기 개요 - `main.py` 를 `app/views` 경로로 이동합니다. - `main.py` 에 연습용 API를 구현합니다. - `run-server.sh` 스크립트를 생성합니다. - `tree` 를 이용해 디렉터리 구조를 확인합니다. main.py 를 app/views 경로로 이동하기 app 디렉터리와 그 하위에 views 디렉터리를 생성합니다. 각 디렉터리에는 __init__.py 파일을 생성합니다. *__init__.py 파일이 없는 경우, 해당 디렉터리는 단순한 디렉터리로 간주됩니다. 반면 __init__.py 파일이 존재하는 디렉터리는 파이썬 패키지로 간주되며, 패키지 내부에 있는 모듈들을 다른 모듈에서 import할 수 있습니다. 기존 main.py..

Python & FastAPI 로 백엔드 시작하기 (1) _ 개발환경 세팅하기

01. 개발환경 세팅하기 이 글은 Python과 FastAPI를 활용하여 백엔드 개발을 시작하고 싶은 분들을 위해 작성하였습니다. 개요 - pyenv로 가상환경을 만들고 Poetry 종속성 관리 도구를 설치한다. - FastAPI 와 Uvicorn 을 사용해 서버를 실행한다. - .gitignore 파일을 생성하여 불필요한 업로드를 막는다. - pre-commit을 활용하여 코드 스타일과 정적 분석을 자동화한다. *사용 기기 : M1 MacBook Air *사용 IDE : Visual Studio Code *만약 터미널 사용이 처음이거나 아직 세팅이 완료되지 않았다면 이전 글을 참고해주세요. 2023.03.18 - [나는 이렇게 논다/백엔드 시작하기 with Python] - Mac M1 터미널 환경 세..

FastAPI _ BaseSettings 을 lru_cache 할 때, unhashable type 에러 해결방법

BaseSettings을 사용한 객체를 lru_cache 할 때, TypeError: unhashable type: 에러가 발생할 때가 있다. 정리하면 다음과 같은 상황이다. given FastAPI 에서 lru_cache로 반환하는 BaseSettings 객체를, when 다시 lru_cache를 사용하는 함수가 인수로 받을 때, then TypeError: unhashable type: 에러가 발생함. e.g class Config(BaseSettings): URL: str = Field(..., env="URL") class Config: env_file = "secrets/.env" env_file_encoding = "utf-8" @lru_cache def get_config() -> Confi..

FastAPI _ Custom Exception 만드는 방법

코드를 작성하다 보면 특정 상황에 대한 예외처리를 만들고 싶을 때가 있다. FastAPI는 일반적으로 HTTPException을 이용해 예외를 처리하는데, 유사한 예외를 반복적으로 처리해야 한다면 우리가 직접 Exception을 커스텀해서 사용할 수 있다. 이번 글에서는 FastAPI에서 Custom Exception을 어떻게 구현하는지 코드로 설명해보겠다. 구현 시작 먼저 아주 간단한 api를 작성해보았다. from fastapi import FastAPI app = FastAPI() @app.get("/{name}") def home(name:str): return {"detail": f"Hello, {name}"} name을 쿼리 스트링으로 넘겨주면 "Hello, {name}"으로 반환해주는 api..

VSCode _ 디버깅하는 방법 (feat. Python - FastAPI)

print로 디버깅? 서버 런타임 중에 버그가 발생했다고 가정해보자. 내가 원하는 값을 반환해주어야 하는데 엉뚱한 값이 나온다. 버그를 찾아 고치기 위해 작성된 코드를 보지만 어디서부터 잘못된 건지 모르겠다. 그럴 때 흔히 하는 방법이 print()로 코드 중간중간을 출력하는 것이다. 의심스러운 지점에 print를 배치하고 내가 생각한 대로 작동하는지 출력해본다. 하지만 이 방법은 리소스가 많이 든다. 개발자가 직접 코드를 작성해야하고 상태나 변수명을 직접 호출해야 한다. 설령 버그를 발견하고 고치더라도 print 지우는 것을 까먹어 불필요한 코드까지 커밋해버리기도 한다...ㅜㅜ 다행히도 VSCode는 우리가 손쉽게 디버깅 할 수 있도록 도와준다. 이번 글에서는 Python - FastAPI 서버를 기준..

로그인시 Access Token, Refresh Token 보내주기

액세스 토큰을 사용하는 이유 서버가 액세스 토큰을 클라이언트에게 주면 클라이언트는 매 요청시 액세스 토큰을 서버로 보내주어 로그인 상태을 알려줍니다. 이러한 방식은 HTTP의 무상태 특성을 보완하기 위한 한 가지 방법이지만 액세스 토큰을 주는 방식은 전달 과정에서 탈취 당할 우려가 있어 보안에 문제가 있습니다. 이를 해결하기 위해 토큰에 만료기간을 주어, 만약 탈취를 당하더라도 시간이 지나면 토큰을 사용할 수 없게 만들 수 있습니다. 하지만 이는 로그인 상태가 주기적으로 풀린다는 뜻이고 사용자에게 큰 불편을 줄 것입니다. 그래서 사람들은 리프레시 토큰을 생각해내었습니다. 리프레시 토큰으로 액세스 토큰 재발급 리프레시 토큰은 액세스 토큰이 만료되었을 경우 이를 확인하고 다시 액세스 토큰을 발급하는 방법입니..

pre-commit 을 이용해 commit 전 코드 체크를 자동화하자.

pre-commit 적용하기 해당 글은 깃헙 레포지토리에서도 확인가능합니다. 깃헙 링크 pre-commit란? 커밋 메시지를 작성하기 전에 호출이 되는 명령어입니다. 커밋이 되기 전 문법 오류나 스타일, 정렬, 타입 오류 등을 체크할 때 사용합니다. 개발자의 기호에 따라 선택하고 커스텀까지 할 수 있습니다. pre-commit 적용 순서 1. git init 2. pip install pre-commit 3. pre-commit install >>> pre-commit installed at .git/hooks/pre-commit 4. pre-commit run >>> An error has occurred: InvalidConfigError: =====> .pre-commit-config.yaml is..

log가져오기 log기록하기 구현 + 테스트 코드 작성

오늘 한 것 'Dacolog'프로젝트에서 log가져오기 log기록하기 구현 이에 대한 test code 작성 (테스트 커버리지 83%) 성장한 점 FastAPI, MySQL을 ORM없이 연동할 수 있게 되었다. post와 get요청에 대한 test code를 작성할 수 있게 되었다. 노력할 점 현재 테스트 코드에서는 코드 실행시 실제 데이터베이스에 레코드가 생성되는 문제가 있다. 레코드가 실제 생성되지 않도록 테스트 코드를 수정하고 싶다. 내일 하고 싶은 것 테스트 코드 수정 테스트 커버리지 100% 만들기 유저 모델 만들기

Log/Today 2022.03.19