FastAPI는 매우 빠르고 현대적인 웹 프레임워크로, Python 3.6+에서 타입 힌트를 사용하여 API를 쉽게 구축할 수 있는 강력한 도구입니다. 이 글에서는 FastAPI를 사용하여 서버를 개발하고, Jinja 템플릿을 사용하여 동적인 웹 페이지를 생성하는 방법을 알아보겠습니다. 특히, Jinja 템플릿에서 if
문을 활용해 조건부 렌더링을 실습할 것입니다.
FastAPI란?
FastAPI는 Python으로 작성된 비동기 웹 프레임워크로, RESTful API를 쉽게 개발할 수 있게 도와줍니다. FastAPI는 다음과 같은 특징을 가지고 있습니다:
- 빠름: Starlette과 Pydantic을 기반으로 하여 비동기 처리를 지원하고, 빠른 성능을 자랑합니다.
- 타입 힌트: Python 타입 힌트를 사용하여 코드의 가독성과 오류 검출을 향상시킬 수 있습니다.
- 자동화된 문서화: API 문서가 자동으로 생성되며 사용자에게 쉽게 제공합니다.
FastAPI와 Jinja2
FastAPI는 템플릿을 사용할 수 있는 백엔드 프레임워크입니다. 이를 통해 클라이언트에게 동적인 HTML 페이지를 제공할 수 있습니다. FastAPI와 Jinja2를 함께 사용하는 방법을 살펴보겠습니다.
설치하기
우선, FastAPI와 Jinja2를 설치해야 합니다. 다음과 같은 명령어로 설치할 수 있습니다:
pip install fastapi[all] jinja2
FastAPI 서버 구성하기
다음은 기본적인 FastAPI 서버를 설정하는 예시 코드입니다:
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})
여기서 우리는 FastAPI 인스턴스를 만들고 Jinja2 템플릿 디렉토리를 설정합니다. 기본적인 루트 경로(“/”)에 대한 GET 요청을 처리하는 함수를 정의하였습니다. 이 함수는 클라이언트에게 index.html
템플릿을 응답합니다.
템플릿 파일 생성하기
템플릿 파일은 templates/index.html
에 생성합니다. 이 파일은 HTML로 구성된 페이지를 정의합니다. 기존 페이지를 위해 다음 내용을 추가할 수 있습니다:
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>FastAPI와 Jinja2 소개</title>
</head>
<body>
<h1>안녕하세요!</h1>
<p>FastAPI 및 Jinja2를 사용하여 동적인 웹 페이지를 만들고 있습니다.</p>
</body>
</html>
Jinja2의 if 문 사용하기
이제 동적인 콘텐츠를 추가해 보겠습니다. Jinja2의 if
문을 사용하여 페이지에서 조건부 로직을 사용할 수 있습니다. 다음은 간단한 예입니다:
<h2>환영합니다!</h2>
<ul>
<li>오늘 날짜는 {{ date }}입니다.</li>
<li>{% if user_logged_in %}로그인 상태입니다.{% else %}로그인하지 않았습니다.{% endif %}</li>
</ul>
여기서 user_logged_in
변수를 조건부로 사용하여 로그인 상태를 출력할 수 있습니다. 이를 위해 FastAPI 서버 코드에서 이 변수를 추가해야 합니다:
from datetime import datetime
@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
user_logged_in = True # 예시로 로그인 상태를 true로 설정
date_today = datetime.now().strftime("%Y-%m-%d")
return templates.TemplateResponse("index.html", {"request": request, "user_logged_in": user_logged_in, "date": date_today})
전체 코드 정리하기
이제 지금까지 작성한 코드를 통합해 봅시다. FastAPI 서버 코드와 템플릿을 최종적으로 구성해보겠습니다:
FastAPI 서버 코드
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi import Request
from datetime import datetime
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
user_logged_in = True # 예시로 로그인 상태를 true로 설정
date_today = datetime.now().strftime("%Y-%m-%d")
return templates.TemplateResponse("index.html", {"request": request, "user_logged_in": user_logged_in, "date": date_today})
templates/index.html 파일
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>FastAPI와 Jinja2 소개</title>
</head>
<body>
<h1>안녕하세요!</h1>
<h2>환영합니다!</h2>
<ul>
<li>오늘 날짜는 {{ date }}입니다.</li>
<li>{% if user_logged_in %}로그인 상태입니다.{% else %}로그인하지 않았습니다.{% endif %}</li>
</ul>
</body>
</html>
데모 실행하기
이제 모든 것이 준비되었습니다. 아래 명령어로 FastAPI 서버를 실행할 수 있습니다:
uvicorn main:app --reload
main.py
파일 이름으로 저장한 후, 위 명령어를 사용하여 서버를 시작할 수 있습니다. 웹 브라우저에서 http://127.0.0.1:8000
를 열면, 우리가 만든 동적인 웹 페이지를 확인할 수 있습니다.
마무리
이 글에서는 FastAPI를 사용하여 간단한 서버를 구축하고, Jinja2의 if
문을 활용하여 조건부 렌더링을 구현하는 방법을 배웠습니다. FastAPI는 속도와 효율성을 자랑하는 훌륭한 웹 프레임워크이며 Jinja2와 함께 사용하면 동적인 웹 페이지를 쉽게 만들 수 있습니다. 이 강좌를 통해 FastAPI와 Jinja2에 대한 이해를 높이길 바랍니다.
향후 더 많은 기능과 복잡한 예제를 구현하는 방향으로 나아가길 권장합니다. FastAPI의 공식 문서와 Jinja2의 문서를 참고하여 더 깊이 있는 학습을 진행해 보세요.