나는 이렇게 학습한다/Framework 7

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=..

Django 에서 middleware 추가하기

Django 에서 middleware 추가하기 장고에서 미들웨어를 추가하는 방법에는 함수형과 클래스형이 있는데 이 글에서는 클래스형에 대해서 설명하겠다. 먼저 미들웨어 클래스를 정의하고 __init__ 메서드와 __call__ 메서드를 다음과 같이 추가하자. from django.http import HttpRequest, HttpResponse class CustomMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request: HttpRequest) -> HttpResponse: some_function() # 요청에 영향을 줄 수 있는 로직 response = self.g..

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..

DRF 궁금한 것 모음

Serializer의 용도는 무엇인가? serializer를 사용하면 쿼리셋과 인스턴스같은 데이터를 json등과 같은 유형으로 쉽게 렌더링 할 수 있다. 뿐만 아니라 데이터의 유효성을 검사해준다. DRF에는 serializer의 종류가 다양하다. (Model, List, Base 등) 레퍼런스 APIView과 @apiview의 차이는 무엇인가? ‘클래스기반 뷰’와 ‘함수 기반 뷰’라고 볼 수 있다. 전자는 기존 장고와 유사하고 후자는 Flask나 FastAPI와 생김새가 유사하다. 레퍼런스 generics와 ViewSet의 차이는 무엇인가? generics 의 경우 ListAPIView, ListCreateAPIView 처럼 형태, 또는 명령에 대한 기능을 도와준다. 하나의 형태나 명령을 넘어서 모두 사..

'ManyToManyField' 또는 '중간테이블'로 데이터 가져오는 방법

django(장고)에서 만들려는 데이터베이스 테이블의 관계가 n:n 관계, 즉 ManyToMany 관계의 테이블을 생성하는 방법은 크게 3가지가 있다. 1번 >>> 중간 테이블을 만들어 중간테이블이 각각 다른 테이블을 FK로 가져오는 방법 2번 >>> models.py 작성시에 다대다 관계의 테이블 중 하나의 테이블에 ManyToManyField를 사용하는 방법(이 방법은 장고가 자동으로 중간테이블을 생성해준다) 3번 >>> 1번, 2번 모두 사용하는 방법으로 중간 테이블을 만들고, ManyToManyField도 사용하면서 중간 테이블 지정을 미리 만들어둔 중간테이블로 지정하는 방법 *세 가지 방법에 대한 차이점(아래 예제를 보고 오면 이해가 될거에요!) 더보기 차이점1. >>> 1번의 경우 A에서 한 ..

장고 용어 정리

장고를 튜토리얼부터 배우고 있는데 아직 모르는 것 투성이다. 따라는 하는데 이해가 안된다. 그렇다면 이해를 하기 위해 무엇부터 공부해야할까? 문득 '모든 언어는 단어에서부터 시작한다'라는 생각이 들었다. 단어의 뜻을 알아야 문장의 의미를 유추할 수 있다. 의미를 유추하면 그제서야 맥락이 보이기 시작한다. 그렇다면 지금 내가 해야할 것은 장고와 관련된, 특히 자주 쓰이는 용어들의 의미를 파악하는 것이다. 이 글은 생소한 용어들을 하나씩 정리하면서 앞으로 내가 장고를 이해하는데 도움이 되어줄 글이다. 앞으로 주기적으로 업데이트 하면서 새로운 용어는 추가하고 잘못알고 있었던 것을 수정할 예정이다. URLconf (파일명 : urls.py) - 클라이언트로부터 요청을 받으면 가장 먼저 요청에 들어있는 URL을 ..