[Django] Messages Framework: flash 메시지
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">×</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 와 정확히 동일한 패턴.
다른 프레임워크
| Framework | Flash message |
|---|---|
| Django | messages.success() |
| Rails | flash[:notice] |
| Spring | RedirectAttributes.addFlashAttribute() |
| Laravel | session()->flash() |
| Express | connect-flash middleware |
흔한 함정
WARNING
- AJAX 응답에 messages = redirect 없이 API 응답 → 다음 요청까지 남음. 명시적 처리.
- messages 후 render = redirect 안 하면 template 에서 소비됨 (다음 request 에 안 보임). PRG.
- Cookie storage 크기 초과 = 4KB 넘으면 잘림. 짧게.
- XSS = 사용자 입력을
messages로 그대로 → escape 안 됨.{{ message|safe }}절대 금지.
관련 위키
- django-sessions
- django-views
- django-mixins
- django-mvc-model-bindingresult (Spring 의 PRG)
이 글의 용어 (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): 일반 함수. 간단하고 …
💬 댓글