a django like messages framework for tornado
TRANSCRIPT
Introduction to a simple messages framework for
TornadoGao Chao 2014.03.14
Tornado
• A high performance asynchronous web framework.
• Originated in FriendFeed, acquired by Facebook later on.
• We are using it!
Messages Framework
• Taken from Django’s messages framework.
• Flash a message after certain actions by user.
Design concern
• Easy to use and simple implementation.
• Messages cannot be dropped on redirection.
• All unseen messages need to be displayed.
Problems
• Implementation
• Storage
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.
Hook
• def prepare(self)
• def render(self, template_name, **kwargs)
Easy Solutiondef 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")
Redirection
Message got lost.!why?
Cookies!or session storage
Solution
• Save messages in cookies
• Clear messages only after user has seen.
How?
• def redirect(self, url, permanet=False, status=None)
• def __iter__(self)
HTML{% if messages %} <ul class="messages"> {% for message in messages %} <li>{{ message }}</li> {% end %} </ul> {% end %}
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.
To sum upclass 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("/")
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)
Read the source code to get more of it!
Thank you!