7. Messages Lifetime
• Request coming in.
• Server execute an action based on passed
parameters.
• Server popup a message to user.
• User sees the web page and the message.
9. Easy Solution
def prepare(self):
# Define a message array as a property of each
# request, and just append every message to
# it.
self.request.messages = []
!
def MyHandler(tornado.web.RequestHandler):
def get(self):
self.request.messages.append("error")
return self.render("my_page.html")
14. HTML
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li>{{ message }}</li>
{% end %}
</ul>
{% end %}
15. Clear
• We can erase all messages stored in cookies
after __iter__ method of Message object was
called.
• We don’t need to update cookies when there is
no redirections happen.
16. To sum up
class BaseHandler(tornado.web.RequestHandler):
def prepare(self):
# Create Message object in order to store instant messages.
self.messages = FlashMessage(handler=self)
!
def redirect(self, url, permanent=False, status=None):
if hasattr(self, "messages"):
# Update messages in Cookie, write in or clear all.
self.messages.update_messages()
!
!
class LoginHandler(BaseHandler):
def post(self):
# Write message to object owned structure.
messages.success(self.messages, "Login successfully!")
!
# Redirect to another handler.
self.redirect("/")
17. Message Insight
!
!
class FlashMessage(object):
"""
A Django messages framework mockup, use cookie to store messages.
"""
…
!
def __iter__(self):
self.used = True
if self._queued_messages:
self._loaded_messages.extend(self._queued_messages)
self._queued_messages = []
# Update messages stored in Cookie
self.update_messages()
return iter(self._loaded_messages)
!
def update_messages(self):
if self.used:
self._store(self._queued_messages)
elif self.added_new:
messages = self._loaded_messages + self._queued_messages
self._store(messages)
!
def _update_cookie(self, encoded_data):
if encoded_data and eval(encoded_data or ''):
self._handler.set_secure_cookie(self.cookie_name, encoded_data,
expires_days=None,
domain=settings.SESSION_COOKIE_DOMAIN)
else:
self._handler.clear_cookie(self.cookie_name,
domain=settings.SESSION_COOKIE_DOMAIN)
!
def _store(self, messages):
encoded_data = self._encode(messages)
# Update cookie, remove if no data included.
self._update_cookie(encoded_data)