我已經設法通過一些注意事項來達成一個可以接受的解決方案。 使用現有的消息存儲(cookie或會話)被證明是不可能的(cookie),或者通過內部方法調用&設置/刪除內部成員(會話)太多。
這個解決方案使用了一個新的消息存儲,在我的情況下是一個數據庫。
settings.py
MESSAGE_STORAGE = 'your_django_app.messages_store.SessionDBStorage'
your_django_app/messages_store.py
from django.contrib.messages.storage.session import SessionStorage
from main.models import MessagesStore, models
class SessionDBStorage(SessionStorage):
"""
Stores messages in the database based on session id
"""
def _get(self, *args, **kwargs):
"""
Retrieves a list of messages from the database based on session identifier.
"""
try:
return self.deserialize_messages(
MessagesStore.objects.get(pk=self.request.session.session_key).messages), True
except models.ObjectDoesNotExist:
return [], True
def _store(self, messages, response, *args, **kwargs):
"""
Stores a list of messages to the database.
"""
if messages:
MessagesStore.objects.update_or_create(session_key=self.request.session.session_key,
defaults={'messages': self.serialize_messages(messages)})
else:
MessagesStore.objects.filter(pk=self.request.session.session_key).delete()
return []
your_django_app/rest.py
def pushed_messages():
from time import sleep, monotonic
# standard get messages code
....
now = monotonic()
while not res.messages and monotonic() - now < 15:
sleep(1)
if hasattr(storage, '_loaded_data'): # one last hack to make storage reload messages
delattr(storage, '_loaded_data')
res.messages = [dict(level=item.level, message=item.message) for item in storage]
請注意,在內部這仍是一個輪詢的解決方案(在循環不斷地重新加載消息),但它證明了這個概念並最終發揮作用。任何基礎的存儲/信號機制優化都超出了這個答案的範圍。