카테고리 없음
어떻게 FastAPI를 사용하여 PDF 파일과 Jinja2 Template 응답을 모두 반환합니까?
스택큐힙리스트
2024. 2. 3. 11:46
반응형
내 FastAPI 애플리케이션은 특정 버튼이 클릭될 때 PDF 파일을 반환합니다. 동시에 FileResponse
(starlette.responses)와 Jinja2 TemplateResponse
를 반환하는 방법이 있을까요?
def generate_report(request: Request, start_date: date = Form(...), end_date: Optional[date] = Form(None)):
start_date = datetime(start_date.year, start_date.month, start_date.day)
end_date = datetime(end_date.year, end_date.month, end_date.day)
attendance = filter_by_date(zk, user_list, start_date, end_date)
users_history = attendance_to_dict(attendance)
worked = count_days(users_history, 0)
pdf = create_pdf(users_history, worked, user_list, start_date, end_date)
pdf_temp = attendance.pdf
pdf.output(pdf_temp)
name = report.pdf
return FileResponse(pdf_temp, media_type=application/pdf, filename=name)
답변 1
마이닝과 비교하여, 여러 부분으로 구성된 응답을 반환하는 주요한 단점은 클라이언트 응용 프로그램이 다른 유형의 콘텐츠를 처리하는 방법을 알아야 한다는 것입니다. 실제로 이는 파일을 표시하거나 HTML을 표시하는 대신 응답을 처리하고 어떤 콘텐츠를 어떤 경우에 보여줄지 선택해야하는 클라이언트가 API를 사용하기 어렵게 만듭니다.
또 다른 단점은 반환된 파일을 다중부 작동 사양과 일치하도록 인코딩해야한다는 것입니다. 이는 응답 크기를 크게 증가시킬 수 있습니다. 이는 상황에 따라 문제가 될 수도 있고 아닐 수도 있지만 기억해 두는 것이 좋습니다.
제안사항
더 간단한 접근 방식을 선택하고 파일을 반환하는 하나의 엔드포인트와 템플릿 생성 문서를 반환하는 다른 엔드포인트를 정의하는 것이 좋습니다. 이 방법에는 다음과 같은 이점이 있습니다:
- 엔드포인트 구현은 더 간단해질 것입니다.
- FastAPI와 Starlette의 문서에는 둘 다 수행하는 예제가 있습니다.
- API 문서를 읽는 사람은 API가 제공하는 내용을 더 명확하게 이해할 수 있을 것입니다.
입력은 같지만 반환하는 내용이 다른 엔드포인트가 있다는 것은 불통에 있지 않습니다.
답변 2
FastAPI는 웹 애플리케이션을 만들 때 효과적인 도구이며, PDF 파일 및 Jinja2 템플릿 응답을 모두 반환하는 방법을 제공합니다.FastAPI에서 PDF 파일과 Jinja2 템플릿 응답을 반환하기 위해서는 다음과 같은 단계를 따릅니다.
1. `io` 모듈을 가져옵니다. 이 모듈은 파일을 처리하는 데 필요한 기능을 제공합니다.
```python
import io
```
2. `PdfResponse` 클래스를 정의합니다. 이 클래스는 PDF 파일을 반환하는데 사용됩니다.
```python
from fastapi.responses import Response
from reportlab.pdfgen import canvas
class PdfResponse(Response):
def __init__(self, content: bytes):
super().__init__(
content,
media_type=application/pdf
)
```
3. FastAPI 애플리케이션에서 라우트를 설정합니다. 이 예시에서는 `/pdf` 엔드포인트로 PDF 파일을 반환하도록 설정합니다.
```python
from fastapi import FastAPI
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory=templates)
@app.get(/pdf)
def get_pdf():
# PDF 생성
byte_stream = io.BytesIO()
pdf = canvas.Canvas(byte_stream)
pdf.drawString(100, 750, 안녕하세요!)
pdf.showPage()
pdf.save()
byte_stream.seek(0)
# PdfResponse로 응답 반환
return PdfResponse(byte_stream.read())
```
4. FastAPI 애플리케이션에서 또 다른 라우트를 설정합니다. 이 예시에서는 `/template` 엔드포인트로 Jinja2 템플릿 응답을 반환하도록 설정합니다.
```python
from fastapi import FastAPI
app = FastAPI()
templates = Jinja2Templates(directory=templates)
@app.get(/template)
def get_template():
# 템플릿을 사용하여 자리 표시자와 함께 HTML 파일 생성
html_content = templates.TemplateResponse(
template.html,
{request: request, placeholder: 안녕하세요!}
)
# HTML 파일을 반환
return html_content
```
이와 같이 FastAPI를 사용하여 PDF 파일과 Jinja2 템플릿 응답을 반환할 수 있습니다. 이를 통해 사용자는 웹 애플리케이션에 접근하고, 필요한 데이터를 포함한 PDF 파일이나 동적인 Jinja2 템플릿을 다운로드하거나 볼 수 있게 됩니다.
FastAPI를 사용하여 다양한 유형의 응답을 반환하는 것은 웹 애플리케이션 개발에 있어서 유연성과 사용자 친화성을 높일 수 있는 중요한 기능 중 하나입니다. 이를 통해 고객들은 훌륭한 경험을 누리며 원하는 정보를 쉽게 얻을 수 있게 됩니다.
반응형