a django like messages framework for tornado

19
Introduction to a simple messages framework for Tornado Gao Chao 2014.03.14

Upload: chao-gao

Post on 04-Jul-2015

931 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: A Django like messages framework for Tornado

Introduction to a simple messages framework for

TornadoGao Chao 2014.03.14

Page 2: A Django like messages framework for Tornado

Tornado

• A high performance asynchronous web framework.

• Originated in FriendFeed, acquired by Facebook later on.

• We are using it!

Page 3: A Django like messages framework for Tornado

Messages Framework

• Taken from Django’s messages framework.

• Flash a message after certain actions by user.

Page 4: A Django like messages framework for Tornado
Page 5: A Django like messages framework for Tornado

Design concern

• Easy to use and simple implementation.

• Messages cannot be dropped on redirection.

• All unseen messages need to be displayed.

Page 6: A Django like messages framework for Tornado

Problems

• Implementation

• Storage

Page 7: A Django like messages framework for Tornado

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.

Page 8: A Django like messages framework for Tornado

Hook

• def prepare(self)

• def render(self, template_name, **kwargs)

Page 9: A Django like messages framework for Tornado

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")

Page 10: A Django like messages framework for Tornado

Redirection

Message got lost.!why?

Page 11: A Django like messages framework for Tornado

Cookies!or session storage

Page 12: A Django like messages framework for Tornado

Solution

• Save messages in cookies

• Clear messages only after user has seen.

Page 13: A Django like messages framework for Tornado

How?

• def redirect(self, url, permanet=False, status=None)

• def __iter__(self)

Page 14: A Django like messages framework for Tornado

HTML{% if messages %} <ul class="messages"> {% for message in messages %} <li>{{ message }}</li> {% end %} </ul> {% end %}

Page 15: A Django like messages framework for Tornado

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.

Page 16: A Django like messages framework for Tornado

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("/")

Page 17: A Django like messages framework for Tornado

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)

Page 18: A Django like messages framework for Tornado

Read the source code to get more of it!

Page 19: A Django like messages framework for Tornado

Thank you!