• Like
Programmation web asynchrone avec Tornado
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Programmation web asynchrone avec Tornado

  • 1,730 views
Published

 

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,730
On SlideShare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
14
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Développement web asynchrone avec Tornado Ronan Amicel @amicel PyCon FR – Paris – 15 septembre 2012
  • 2. Ronan Amicel• Entrepreneur• Startup advisor• Python !
  • 3. Tornado c’est quoi ?• Un serveur web – scalable et non-bloquant (utilise epoll ou kqueue)• Un framework web – proche de web.py ou webapp – exploite l’infrastructure non-bloquante sous-jacente
  • 4. Bonjour les gens !import tornado.ioloopimport tornado.webclass MainHandler(tornado.web.RequestHandler): def get(self): self.write("Bonjour les gens !")application = tornado.web.Application([ (r"/", MainHandler),])if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()
  • 5. (Some) Batteries Included• Moteur de templates• Localisation• Client HTTP asynchrone• Client MySQL asynchrone• OpenID et OAuth (Twitter, Facebook, Google)• Web Socket
  • 6. Cas dutilisation• Seul ou en complément dun framework « classique »• Sites à forte charge (milliers de requêtes / seconde)• Messagerie instantanée, chat rooms• Requêtes dépendant de services externes à latence variable (API Facebook, Twitter, etc.)• Mises à jour « temps réel » dans une page web
  • 7. Mises à jour « temps réel » Polling Long Polling Streaming (Ajax) (Comet) (Web Socket) événements événements événementsNavigateur Serveur Navigateur Serveur Navigateur Serveur
  • 8. Web Socket (côté serveur)from tornado.websocket import WebSocketHandlerclass EchoWebSocket(WebSocketHandler): def open(self): print "WebSocket opened" def on_message(self, message): self.write_message(u"You said: " + message) def on_close(self): print "WebSocket closed"
  • 9. Web Socket (côté client)var ws = new WebSocket("ws://localhost:8888/websocket");ws.onopen = function () { ws.send("Hello, world");};ws.onmessage = function (evt) { alert(evt.data);};
  • 10. Requêtes asynchronesfrom tornado.httpclient import AsyncHTTPClientfrom tornado.web import RequestHandler, asynchronousclass MyRequestHandler(RequestHandler): @asynchronous def get(self): http = AsyncHTTPClient() http.fetch(http://friendfeed.com/, self._on_download) def _on_download(self, response): self.write(Downloaded!) self.finish()
  • 11. Masquer les callbacks avec tornado.genfrom tornado.gen import engine, Taskfrom tornado.httpclient import AsyncHTTPClientfrom tornado.web import RequestHandler, asynchronousclass MyRequestHandler(RequestHandler): @asynchronous @engine def get(self): http = AsyncHTTPClient() response = yield Task(http.fetch, http://friendfeed.com/) self.write(Downloaded!) self.finish()
  • 12. Tâches concurrentes avec tornado.genclass MyRequestHandler(RequestHandler): @asynchronous @engine def get(self): http = AsyncHTTPClient() response1, response2 = yield [ Task(http.fetch, url1), Task(http.fetch, url2), ] self.write(Downloaded!) self.finish()
  • 13. Bibliothèques asynchrones• PostgreSQL• MongoDB• Redis• Memcache• RabbitMQ
  • 14. Qui utilise Tornado ?focus.io
  • 15. Historique• 2007 : FriendFeed• Août 2009 : rachat par Facebook• Septembre 2009 : première version diffusée sous licence Apache 2.0• Juillet 2010 : Tornado 1.0• Juin 2011 : Tornado 2.0• Septembre 2012 : Tornado 2.4
  • 16. Les côtés négatifs• Asynchrone – Moins lisible que du code synchrone – Plus complexe à déboguer• Communauté – Moins populaire que Django, Flask, Pyramid...
  • 17. Ressources• http://www.tornadoweb.org/• http://pypi.python.org/pypi/tornado• https://github.com/facebook/tornado/