django/django · error · ValueError

Not all temporary messages could be stored.

Error message

Not all temporary messages could be stored.

What it means

ValueError raised by MessageMiddleware.process_response when, after storage.update(response), some messages remain unstored AND settings.DEBUG is True. The storage backend returns the list of messages it could not persist (e.g. cookie overflow); in debug mode Django surfaces this loudly instead of silently dropping them (middleware.py:22-25).

Source

Thrown at django/contrib/messages/middleware.py:25

    """
    Middleware that handles temporary messages.
    """

    def process_request(self, request):
        request._messages = default_storage(request)

    def process_response(self, request, response):
        """
        Update the storage backend (i.e., save the messages).

        Raise ValueError if not all messages could be stored and DEBUG is True.
        """
        # A higher middleware layer may return a request which does not contain
        # messages storage, so make no assumption that it will be there.
        if hasattr(request, "_messages"):
            unstored_messages = request._messages.update(response)
            if unstored_messages and settings.DEBUG:
                raise ValueError("Not all temporary messages could be stored.")
        return response

View on GitHub (pinned to b5388a3a80)

Solutions

  1. Switch storage to session-backed: `MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'` (requires SessionMiddleware).
  2. Reduce message size — surface a short message and persist detail elsewhere (DB, log).
  3. Set DEBUG=False in production so unstorable messages are silently dropped (only a stopgap; root cause is oversized data).

Example fix

// before
# settings.py (default cookie storage, DEBUG=True)
messages.success(request, very_long_html_blob)
// after
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
messages.success(request, 'Import finished; see report for details.')
Defensive patterns

Strategy: fallback

Validate before calling

from django.conf import settings
def storage_is_cookie() -> bool:
    return getattr(settings, 'MESSAGE_STORAGE', '').endswith('CookieStorage')

Prevention

When it happens

Trigger: Using cookie-based message storage (the default) and adding a message whose serialized form exceeds the browser cookie size limit (commonly 4093 bytes), e.g. dumping a large object into a success message. In DEBUG=True the unstored list is non-empty and line 25 raises.

Common situations: Storing large debug dumps or long tracebacks as messages with cookie storage; many messages accumulated across redirects; misconfigured MESSAGE_STORAGE staying at the default cookie backend while DEBUG is on.

Related errors


AI-assisted analysis of django/django@b5388a3a80 (2026-08-10). Data as JSON: /api/errors/c456c7f9173788ea. Report an issue: GitHub.