본문으로 건너뛰기
김신건의 로그

[Django] Messages Framework: flash 메시지

· 수정 · 📖 약 1분 · 299자/단어 #django #messages #flash #session
django messages, flash messages, messages.success, messages.error, add_message

정의

Messages Framework = 1회성 flash 메시지 (성공, 오류 등) 를 사용자에게 표시. Post/Redirect/Get 패턴에서 필수.

목적 + 대안

flowchart LR
    Q{피드백 방법}
    Q -->|"1회성 알림"| Msg["Messages framework"]
    Q -->|"영구 데이터"| Model["Model + View"]
    Q -->|"에러 폼 유지"| Form["Form errors"]
    Q -->|"실시간 push"| WS["WebSocket / SSE"]

기본 설정

# settings.py
INSTALLED_APPS = [
    ...
    'django.contrib.messages',
    ...
]

MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
    ...
    'django.contrib.messages.middleware.MessageMiddleware',
]

TEMPLATES = [{
    'OPTIONS': {
        'context_processors': [
            ...
            'django.contrib.messages.context_processors.messages',
        ],
    },
}]

사용

# views.py
from django.contrib import messages

def create_article(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, '게시글이 등록되었어요.')
            return redirect('article_list')
        else:
            messages.error(request, '입력을 확인해주세요.')
    else:
        form = ArticleForm()
    return render(request, 'form.html', {'form': form})

5가지 레벨

함수레벨
messages.debug(request, ...)DEBUG (10)
messages.info(request, ...)INFO (20)
messages.success(request, ...)SUCCESS (25)
messages.warning(request, ...)WARNING (30)
messages.error(request, ...)ERROR (40)
messages.add_message(request, level, ...)커스텀

Template 표시

<!-- base.html -->
{% if messages %}
<div class="messages">
  {% for message in messages %}
    <div class="alert alert-{{ message.tags }}" role="alert">
      {{ message }}
      <button type="button" class="close" data-dismiss="alert">&times;</button>
    </div>
  {% endfor %}
</div>
{% endif %}

message.tags = success, error, warning 등 CSS 클래스 그대로.

옵션 (Extra tags)

messages.success(
    request,
    '완료!',
    extra_tags='animate-bounce',
    fail_silently=False,
)
{{ message.tags }}  <!-- "success animate-bounce" -->

Level 설정

# settings.py
from django.contrib.messages import constants as message_constants

MESSAGE_LEVEL = message_constants.WARNING   # 이 레벨 이상만 저장
# 특정 request 만
messages.set_level(request, messages.DEBUG)

Storage Backend

Backend의미
SessionStorage (기본)Django session 에 저장
CookieStorage브라우저 cookie 에 (session-less)
FallbackStorage (기본)Cookie 우선, 크면 session
MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'

HTMX 통합 예시

from django.http import HttpResponse

def htmx_action(request):
    do_something()
    messages.success(request, '완료됨')

    if request.htmx:
        response = HttpResponse('OK')
        response['HX-Trigger'] = json.dumps({'showMessages': True})
        return response
    return redirect('home')
<div hx-get="{% url 'messages' %}" hx-trigger="showMessages from:body"></div>

Class-Based View 통합

from django.contrib.messages.views import SuccessMessageMixin

class ArticleCreateView(SuccessMessageMixin, CreateView):
    model = Article
    fields = ['title', 'body']
    success_message = '게시글 "%(title)s" 이 등록되었습니다.'
    success_url = '/articles/'

PRG (Post/Redirect/Get) 패턴

sequenceDiagram
    autonumber
    User->>View: POST /create/
    View->>DB: 저장
    View->>Messages: success('완료!')
    View-->>User: 302 → /list/
    User->>View: GET /list/
    View->>Messages: 꺼내기
    View-->>User: HTML with flash
    Note over User: 새로고침 시 message 없음 (1회성)

Rails 의 flash 와 정확히 동일한 패턴.

다른 프레임워크

FrameworkFlash message
Djangomessages.success()
Railsflash[:notice]
SpringRedirectAttributes.addFlashAttribute()
Laravelsession()->flash()
Expressconnect-flash middleware

흔한 함정

WARNING

  1. AJAX 응답에 messages = redirect 없이 API 응답 → 다음 요청까지 남음. 명시적 처리.
  2. messages 후 render = redirect 안 하면 template 에서 소비됨 (다음 request 에 안 보임). PRG.
  3. Cookie storage 크기 초과 = 4KB 넘으면 잘림. 짧게.
  4. XSS = 사용자 입력을 messages 로 그대로 → escape 안 됨. {{ message|safe }} 절대 금지.

관련 위키

이 글의 용어 (4개)
[Django] Mixin 패턴: LoginRequired, UserPasses, Customdjango
정의 Django Mixin은 CBV에 공통 기능을 추가하는 작은 클래스. 다중 상속으로 조합. 인증, 권한, 로깅, 메시지 등에 활용. MRO(Method Resolution …
[Django] MTV 패턴과 Model 기본django
정의 Django 는 MTV (Model, Template, View) 패턴 사용. 다른 프레임워크의 MVC 와 이름만 다르고 개념은 유사. | MVC | Django MTV |…
[Django] Sessions와 Cookiesdjango
정의 Django Session은 서버 측 사용자 상태 저장. 클라이언트엔 세션 ID만 쿠키로 저장, 실제 데이터는 백엔드(DB, cache, file, cookie). 인증, …
[Django] View: 함수 기반 vs 클래스 기반django
정의 Django View는 HTTP 요청을 받아 응답을 반환하는 callable. 두 스타일이 공존. - FBV (Function-Based View): 일반 함수. 간단하고 …

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기