FastAPI 서버개발, Jinja, if문

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의 문서를 참고하여 더 깊이 있는 학습을 진행해 보세요.