FastAPI는 현대적인 웹 API를 구축하기 위한 Python 웹 프레임워크입니다. 비동기 프로그래밍을 지원하며, 자동으로 문서화된 API를 생성할 수 있는 장점이 있습니다. 이 글에서는 FastAPI 서버를 개발하고, Jinja 템플릿 엔진을 사용하여 HTML 템플릿을 렌더링하며, Jinja의 필터를 활용하는 방법에 대해 자세히 설명하겠습니다.
FastAPI란?
FastAPI는 Python 3.6+을 지원하며, Starlette와 Pydantic을 기반으로 한 웹 프레임워크입니다. 주된 장점은 다음과 같습니다:
- 비동기 지원: 비동기 프로그래밍을 통해 더 많은 요청을 처리할 수 있습니다.
- 자동 문서화: OpenAPI 및 JSON Schema를 기반으로 자동으로 API 문서를 생성합니다.
- 높은 성능: 비동기 처리 덕분에 높은 성능을 자랑합니다.
FastAPI 설치 및 기본 서버 설정
FastAPI를 설치하기 위해서는 pip를 사용하여 다음과 같이 설치합니다:
pip install fastapi uvicorn
설치가 완료되면 기본 FastAPI 서버를 설정해 보겠습니다. 다음 코드를 main.py
라는 파일에 작성하십시오:
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
app = FastAPI()
@app.get("/", response_class=HTMLResponse)
async def read_root():
return "안녕하세요, FastAPI!
"
서버를 실행하기 위해서는 아래와 같이 uvicorn을 사용합니다:
uvicorn main:app --reload
브라우저에서 http://127.0.0.1:8000
로 접속하면 “안녕하세요, FastAPI!”라는 메시지를 확인할 수 있습니다.
Jinja2 템플릿 사용하기
템플릿 엔진은 HTML 파일을 동적으로 렌더링할 수 있게 해줍니다. FastAPI는 Jinja2를 지원합니다. Jinja2를 설치하기 위해 다음을 사용합니다:
pip install jinja2
Jinja2를 설정하기 위해 다음과 같이 코드를 수정합니다:
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi import Request
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
위 코드에서 Jinja2Templates
클래스를 사용하여 템플릿 디렉토리를 설정했습니다. 이제 templates
폴더를 만들고 index.html
파일을 생성하여 다음과 같은 내용을 추가합니다:
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>FastAPI와 Jinja2</title>
</head>
<body>
<h1>FastAPI와 Jinja2 템플릿 예제</h1>
<p>안녕하세요, FastAPI!</p>
</body>
</html>
Jinja2의 필터 사용하기
Jinja2에서 필터를 사용하면 템플릿에서 변수를 변경하거나 가공할 수 있습니다. 예를 들어, 날짜 형식을 변환하거나, 텍스트를 대문자나 소문자로 변경하는 등의 작업을 할 수 있습니다.
이제 Jinja2 필터를 사용하여 변수를 처리하는 방법을 살펴보겠습니다. index.html
파일을 다음과 같이 수정합니다:
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>FastAPI와 Jinja2</title>
</head>
<body>
<h1>FastAPI와 Jinja2 템플릿 예제</h1>
<p>안녕하세요, FastAPI!</p>
<p>현재 시간: {{ current_time|strftime("%Y-%m-%d %H:%M:%S") }}</p>
</body>
</html>
각 요청 시 현재 시간이 표시되는 기능을 추가해 보겠습니다. 이를 위해 FastAPI에 시간 정보를 넘겨주어야 합니다. main.py
를 다음과 같이 수정합니다:
from datetime import datetime
@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
current_time = datetime.now()
return templates.TemplateResponse("index.html", {"request": request, "current_time": current_time})
이제 브라우저에서 페이지를 새로 고침하면 현재 날짜와 시간이 형식화되어 나타납니다.
기본 제공 필터
Jinja2에서 제공하는 기본 필터들 중 일부를 소개하겠습니다:
- lower: 문자열을 소문자로 변환합니다.
- upper: 문자열을 대문자로 변환합니다.
- capitalize: 첫 글자를 대문자로 변환합니다.
- title: 각 단어의 첫 글자를 대문자로 변환합니다.
- replace: 문자열에서 특정 부분을 대체합니다.
예를 들어, 문자열을 대문자로 변환하는 예를 보여드리겠습니다. index.html
를 다음과 같이 수정합니다:
<p>대문자 변환: {{ "hello fastapi"|upper }}</p>
위의 코드를 추가하면 “hello fastapi”라는 문자열이 대문자로 변환되어 출력됩니다.
자체 정의 필터 만들기
Jinja2에서는 사용자가 직접 필터를 정의할 수도 있습니다. FastAPI에서 Jinja2 템플릿에 새로운 필터를 추가하는 방법은 다음과 같습니다. 먼저 필터 함수를 정의합니다:
def custom_filter(value: str) -> str:
return value.replace("FastAPI", "빠른 API")
그 다음, 이 필터를 템플릿 환경에 등록합니다:
from fastapi import FastAPI
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
templates.env.filters['custom_filter'] = custom_filter
마지막으로 index.html
에서 이 필터를 사용하여 아래와 같이 업데이트합니다:
<p>사용자 정의 필터 적용: {{ "FastAPI는 빠르고 쉬운 웹 프레임워크입니다 "|custom_filter}}</p>
결론
FastAPI를 사용한 웹 서버 개발과 Jinja2 템플릿 엔진을 활용한 동적 템플릿 렌더링 방법을 살펴보았습니다. 또한 필터를 사용하여 데이터를 표시하는 방법과 사용자 정의 필터를 만드는 방법도 알아보았습니다. 이 조합을 통해 다양한 웹 애플리케이션을 손쉽게 개발할 수 있습니다.
더 많은 정보를 얻으시려면 FastAPI 공식 문서와 Jinja2 공식 문서를 참고하시기 바랍니다.