1. FastAPI 개요
FastAPI는 Python으로 작성된 현대적인 웹 프레임워크로, 빠르고 간편하게 API 서버를 구축할 수 있도록 설계되었습니다.
비동기 처리를 지원하고, 자동적인 문서화 (Swagger, ReDoc)을 제공하는 것이 큰 장점입니다.
FastAPI를 사용하면 개발자가 신속하게 RESTful API를 개발할 수 있습니다.
이번 포스트에서는 FastAPI의 기본적인 설정 방법과, Jinja2를 이용한 HTML 템플릿 랜더링, 그리고 템플릿 상속에 대해 알아보겠습니다.
2. FastAPI 설치 및 기본 설정
FastAPI를 사용하기 전에, 먼저 필요한 패키지를 설치해야 합니다. FastAPI는 Starlette 프레임워크 위에서 동작하기 때문에 Starlette도 함께 설치됩니다.
아래의 명령어를 사용하여 FastAPI와 uvicorn (ASGI 서버)를 설치합니다.
pip install fastapi uvicorn
2.1 기본 FastAPI 앱 작성
FastAPI 애플리케이션의 기본 코드는 다음과 같이 작성할 수 있습니다.
FastAPI 인스턴스를 생성하고, 간단한 GET 요청을 처리하는 API 엔드포인트를 만들어보겠습니다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
위 코드를 main.py
라는 파일에 저장한 후 다음 명령어로 서버를 실행할 수 있습니다.
uvicorn main:app --reload
“http://127.0.0.1:8000″에 접속하면 {“Hello”: “World”}라는 JSON 응답을 받을 수 있습니다.
3. Jinja2 템플릿 엔진과의 통합
FastAPI는 Jinja2 템플릿 엔진과 쉽게 통합할 수 있습니다. Jinja2는 Python 코드 안에서 HTML을 생성할 수 있는 템플릿 엔진입니다.
먼저 다음 패키지를 설치하여 Jinja2를 사용할 수 있도록 합니다.
pip install jinja2
3.1 템플릿 디렉토리 설정 및 기본 HTML 파일 작성
템플릿 파일을 저장할 디렉토리를 생성합니다. 예를 들어, templates
라는 디렉토리를 생성하겠습니다.
그 안에 index.html
파일을 작성합니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FastAPI와 Jinja</title>
</head>
<body>
<h1>환영합니다!</h1>
<p>FastAPI와 Jinja2 템플릿 엔진을 사용하는 방법을 배우고 있습니다.</p>
</body>
</html>
3.2 FastAPI에서 Jinja2 템플릿 사용하기
FastAPI 애플리케이션에 Jinja2 템플릿을 통합하는 방법은 다음과 같습니다.
아래의 코드를 main.py
에 추가합니다.
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
from fastapi.responses import HTMLResponse
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
위와 같이 설정한 후 서버를 실행하면, 웹 브라우저에서 “http://127.0.0.1:8000″에 접속했을 때 index.html
의 내용이 렌더링됩니다.
4. 템플릿 상속
Jinja2는 템플릿 상속 기능을 제공하여, 기본 템플릿을 정의하고 이를 상속해 서브 템플릿을 작성할 수 있습니다.
이는 코드의 재사용성을 높이고, 일관된 디자인을 유지하는 데 매우 유용합니다.
4.1 기본 템플릿 작성
먼저 base.html
이라는 기본 템플릿 파일을 생성합니다. 이 파일은 페이지 레이아웃을 정의합니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FastAPI 템플릿 상속</title>
</head>
<body>
<header>
<h1>사이트 헤더</h1>
</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>
<p>사이트 푸터</p>
</footer>
</body>
</html>
4.2 서브 템플릿 작성
이제 아래와 같이 index.html
템플릿을 수정하여 base.html
을 상속받도록 합니다.
{% extends "base.html" %}
{% block content %}
<h2>환영합니다!</h2>
<p>템플릿 상속의 예제입니다.</p>
{% endblock %}
4.3 FastAPI에서 템플릿 렌더링
이제 다시 main.py
의 해당 엔드포인트로 돌아가서, 서브 템플릿이 올바르게 렌더링되는지 확인해보겠습니다.
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
from fastapi.responses import HTMLResponse
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
앞에서 작성한 서브 템플릿 index.html
이 base.html
의 레이아웃을 상속받아 렌더링 됩니다.
이로써 코드의 재사용성이 보장되었습니다.
5. FastAPI의 Jinja2 활용 사례
FastAPI와 Jinja2의 조합은 동적인 웹 페이지를 만들 때 유용하게 사용됩니다.
예를 들어, 사용자 정보를 데이터베이스에서 가져와 템플릿에 렌더링하는 과정을 생각해볼 수 있습니다.
다음은 간단한 사용자 목록을 보여주는 예제입니다.
5.1 데이터베이스 모델 설정
여기서는 SQLAlchemy를 사용하여 데이터베이스 모델을 정의하겠습니다. 데이터베이스 연결 및 모델을 설정합니다.
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
DATABASE_URL = "sqlite:///./test.db" # 간단한 SQLite 데이터베이스
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
email = Column(String, index=True)
Base.metadata.create_all(bind=engine)
5.2 사용자 목록 반환 엔드포인트 작성
사용자 목록을 반환하는 엔드포인트를 FastAPI에 추가합니다.
아래와 같이 작성합니다.
from fastapi import Depends, FastAPI, Request
from sqlalchemy.orm import Session
app = FastAPI()
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.get("/users/", response_class=HTMLResponse)
async def read_users(request: Request, db: Session = Depends(get_db)):
users = db.query(User).all()
return templates.TemplateResponse("users.html", {"request": request, "users": users})
5.3 사용자 목록 템플릿 작성
사용자 목록을 보여주기 위한 users.html
템플릿을 작성합니다.
{% extends "base.html" %}
{% block content %}
<h2>사용자 목록</h2>
<ul>
{% for user in users %}
<li>{{ user.name }} ({{ user.email }})</li>
{% endfor %}
</ul>
{% endblock %}
6. 결론
이번 포스트에서는 FastAPI로 백엔드 서버를 개발하고, Jinja2를 활용한 템플릿 렌더링 방법과 템플릿 상속에 대해 알아보았습니다.
FastAPI는 간단한 설정으로 API 서버를 구축할 수 있으며, Jinja2와 함께 사용하면 동적인 웹 페이지를 생성하는 데 강력한 도구가 됩니다.
이러한 조합을 통해 여러분의 웹 애플리케이션 개발에 많은 도움을 받을 수 있기를 바랍니다.