본문 바로가기

Coding/Python113

ASGI에서 HTTP Request 다루는 방법 ASGI with HTTP Reqeust 이전 글(https://www.hides.kr/1111)에서 ASGI 인터페이스의 기초에 대해 설명했다. 이제 HTTP Request의 메시지 구조에 대해 좀 더 자세히 살펴보고 ASGI에서 HTTP Request를 다루기 위해 Starlette 라이브러리에서 제공하는 data structure를 어떻게 사용할 수 있는지에 대해 알아본다. ASGI 어플리케이션에서 발생하는 첫 번째 일은 Request가 들어올 때 초기 정보들을 담은 Scope 딕셔너리가 인스턴스화 된다는 것이다. 아래 예제는 간단한 HTTP Request에 대해 Scope가 어떠한 형태로 구성되는지를 나타낸다. >>> scope = { "type": "http", "http_version": "1.. 2022. 11. 24.
ASGI와 HTTP ASGI Callable interface ASGI는 callable interface들로 구성되어있다. 첫 번째 API요청은 새로운 상태를 가진 컨텍스트를 설정하기 위해 수행되는 동기 함수 호출이다. 두 번째는 비동기 함수 호출인데, 이는 서버와 클라이언트간 통신을 위해 사용된다. 대략적인 기본 구조는 아래와 같다. def asgi_app(scope): async def asgi_instance(receive, send): ... return asgi_instance Scope Scope는 어플리케이션의 상태를 세팅하는 인자로 딕셔너리 형태로 구성되어있다. ASGI는 HTTP뿐만 아니라 다양한 인터페이스에서 사용할 수 있는데, 이 때문에 type이라는 중요한 키가 scope 딕셔너리 내부에 포함되어있다.. 2022. 11. 24.
FastAPI BaseHTTPMiddleware 관련 이슈 개요 FastAPI에서 Custom Middleware를 생성할 때 일반적으로 BaseHTTPMiddleware를 상속받아서 구현하는 형태로 사용한다. https://www.starlette.io/middleware/#basehttpmiddleware Starlette의 Middleware 관련 문서에 들어가보면 자세한 내용이 나와있다. 하지만 해당 미들웨어의 경우 몇가지 이슈가 존재하는데 그에 관해 간단하게 살펴보고 해결책을 제시하고자 한다. 문제점 첫 번째로 중간에 Request가 끊기면 정상적으로 동작하지 못한다. No response에러가 발생하며 예외가 터지게 된다. 두 번째로 BackgroundTasks와 이슈가 발생한다. 첫 번째 이슈의 연장선으로, Request가 들어오고 Backgroun.. 2022. 7. 23.
FastAPI add_middleware() 관련 이슈 개요 FastAPI에서 일반적으로 미들웨어를 설정하는 경우 add_middleware() 메소드를 활용한다. 하지만 https://github.com/tiangolo/fastapi/issues/5071 깃헙 이슈에 따르면 해당 메소드의 경우 호출할 때 마다 미들웨어를 re-initialize하는 이슈가 있다고 한다. 따라서 Middleware클래스를 활용하여 넣어주는 방식으로 변경하는게 좋다고 나와있고 본 포스팅에서는 관련된 내용을 간단하게 담아본다. Middleware 클래스 일반적인 미들웨어 세팅 방식은 다음과 같다. app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_.. 2022. 7. 23.
Python Generic Type 개요 스프링에서는 Spring Data JPA라는 것이 존재한다. 해당 라이브러리는 인터페이스를 생성 후 특정 인터페이스를 상속받으면 자동으로 메소드가 생성되는 역할을 한다. 예를 들어 findById(), findByEmail(), save(), delete() 등 여러가지 CRUD관련 메소드가 자동으로 생성된다. 실무에서 파이썬을 통해 서버를 개발하며 Layered architecture를 도입해서 사용하고 있는데, 특정 레포지토리를 생성할 때 마다 동일한 역할을 하는 메소드를 만드는게 귀찮았다. 그래서 스프링의 Data JPA와 같은 것을 만들어볼 순 없을까 생각했고 우연찮게 FastAPI 를 만든 개발자의 깃헙에서 비슷한 코드를 발견하였다. (https://github.com/tiangolo/fu.. 2022. 7. 7.
Python Metaclass 사용해보기 개요 파이썬에는 메타 클래스(Metaclass)라는 것이 존재한다. 메타 프로그래밍(Meta prgramming)이라고도 불리는데 이를 이용하면 특이한 행위를 수행하는 클래스를 만들 수 있다. 기본적으로 파이썬에서 메타 클래스란 클래스를 만드는 클래스를 의미하고 이를 구현하는 방법은 아래와 같이 두 가지가 존재한다. - type을 사용하여 동적으로 클래스를 생성하는 방식 - type을 상속받은 후 메타 클래스를 구현하는 방식 대부분의 경우에서 메타 클래스가 필요한 경우는 없다고 볼 수 있다. 인터넷을 찾아보면 Django ORM 등을 구현할 때 사용하는 방법이라는 예제도 나와있는데 실제로 나도 실무에서 메타 클래스를 사용한 경험은 거의 없었다. 구글 등 파이썬 메타 클래스에 대해 검색하면 수많은 자료들이.. 2022. 7. 6.