반응형

아래는 FastAPI에서 정적 파일을 제공하는 간단한 예시 코드이다.

# main.py

from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse

app = FastAPI()

# 정적 파일을 위한 디렉토리 마운트
app.mount("/static", StaticFiles(directory="static"), name="static")

@app.get("/", response_class=HTMLResponse)
async def read_root():
    return """
    <html>
        <head>
            <title>FastAPI Static Files Example</title>
        </head>
        <body>
            <h1>FastAPI Static Files 예시</h1>
            <img src="/static/example.jpg" alt="예시 이미지">
            <link rel="stylesheet" href="/static/styles.css">
        </body>
    </html>
    """

위 코드를 실행하려면 아래와  같은 디렉토리 구조가 필요하다.

your_project/
├── main.py (위 파일)
└── static/
    ├── example.jpg
    └── styles.css

 

정적 파일을 위한 디렉토리 마운트를 수행하는 코드를 각 파라미터 별로 살펴보자.

app.mount("/static", StaticFiles(directory="static"), name="static")

 

  1. "/static" (첫 번째 파라미터):
    • URL 경로를 지정한다.
    • 웹 애플리케이션에서 정적 파일에 접근할 때 사용할 기본 URL 경로이다.
      • ex: "/static/images/photo.jpg"처럼 접근
    • 다른 경로로도 변경 가능하다 (예: "/assets", "/public" 등)
  2. StaticFiles(directory="static") (두 번째 파라미터):
    • 실제 파일 시스템의 디렉토리를 지정한다
    • directory="static": 프로젝트 폴더 내의 'static' 폴더를 의미
    • 이 디렉토리 안에 있는 모든 파일들이 첫 번째 파라미터에서 지정한 URL 경로를 통해 접근 가능해진다.
    • 절대 경로도 사용 가능하다 (예: directory="/path/to/files")
  3. name="static" (세 번째 파라미터):
    • 마운트 지점의 이름을 지정한다.
    • FastAPI의 URL 생성 기능에서 이 이름을 참조할 때 사용 가능하다.
    • 템플릿에서 URL을 동적으로 생성할 때 이 이름을 사용할 수 있다(특히 Jinja2 템플릿에서 많이 사용됨).
    • 선택적 파라미터이다. (생략 가능)

 

정적 파일  마운팅의 여러 예시

from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles

app = FastAPI()

# 기본적인 사용
app.mount("/static", StaticFiles(directory="static"), name="static")

# 다른 경로와 디렉토리 사용
app.mount("/assets", StaticFiles(directory="public_files"), name="assets")

# 절대 경로 사용
app.mount("/files", StaticFiles(directory="/var/www/files"), name="files")

 

 

실제 파일 시스템과 URL의 관계 예시

파일 시스템:        URL 접근:
static/             
├── images/         /static/images/
│   └── logo.png    /static/images/logo.png
├── css/            /static/css/
│   └── style.css   /static/css/style.css
└── js/             /static/js/
    └── script.js   /static/js/script.js

 

반응형

+ Recent posts