SlideShare a Scribd company logo
Rapid Web Development with
                    Tornado Web and MongoDB
                                Ikai Lan
                             Twitter: @ikai




Friday, June 10, 2011
About the speaker

                        • Developer Relations at Google
                        • Software Engineering background
                        • Lives in San Francisco, CA
                        • Writes Java, Python on a day to day basis
                        • Twitter: @ikai

Friday, June 10, 2011
This talk

                        • Why Tornado Web and MongoDB?
                        • Whirlwind tour of Tornado (get it?!)
                        • Intro to MongoDB
                        • Brief look at a demo app

Friday, June 10, 2011
What I won’t be talking
                          about

                        • Scalability - loaded topic
                        • Reliability - another loaded topic


Friday, June 10, 2011
So why tornado/
                            mongo?


Friday, June 10, 2011
Joy.
Friday, June 10, 2011
Where does this joy
                          come from?


Friday, June 10, 2011
Freedom.
Friday, June 10, 2011
So really, my talk should
                  have been called “The
                 Joy of Tornado Web and
                        Mongo DB”

Friday, June 10, 2011
Intangibles

                        • Tornado - fast development, very few rules
                        • MongoDB - freedom from a predefined
                          schema
                        • Python, of course. Dynamically typed
                          variables, duck typing plus everything else
                          that is cool about the language



Friday, June 10, 2011
Tornado Web history
                        • Open Sourced by Facebook
                        • ... formerly of FriendFeed
                        • ... former Googlers (that’s why the
                          framework looks like App Engine’s webapp
                          - they wrote it)
                        • Tornado Web powers FriendFeed

Friday, June 10, 2011
A whirlwind tour
Friday, June 10, 2011
Tornado features
                        • Out of the box auth with Twitter,
                          Facebook, Google and FriendFeed
                        • Out of box support for localized strings
                        • Simple templating that allows arbitrary
                          Python code
                        • Asynchronous requests
                        • Small codebase
Friday, June 10, 2011
Simple handlers
                        import tornado.ioloop
                        import tornado.web

                        class HelloHandler(tornado.web.RequestHandler):
                            def get(self):
                                self.write("Hello, world :)")

                        class GoodbyeHandler(tornado.web.RequestHandler):
                            def get(self):
                                self.render("goodbye.html",
                                             message=”Goodbye, world”)

                        application = tornado.web.Application([
                            (r"/hello", HelloHandler),
                            (r"/goodbye", GoodbyeHandler),
                        ])

                        if __name__ == "__main__":
                            application.listen(8888)
                            tornado.ioloop.IOLoop.instance().start()




Friday, June 10, 2011
Asynchronous nature
                  class MainHandler(tornado.web.RequestHandler):

                        @tornado.web.asynchronous
                        def get(self):
                            http = tornado.httpclient.AsyncHTTPClient()
                            http.fetch("http://friendfeed-api.com/v2/feed/bret",
                                       callback=self.on_response)

                        def on_response(self, response):
                            if response.error: raise tornado.web.HTTPError(500)
                            json = tornado.escape.json_decode(response.body)
                            self.write("Fetched " + str(len(json["entries"])) + " entries "
                                       "from the FriendFeed API")
                            self.finish()




Friday, June 10, 2011
Unrestrictive templating
                        {% for student in [p for p in people if p.student and p.age > 23] %}
                          <li>{{ escape(student.name) }}</li>
                        {% end %}



                        # Sample of arbitrary functions in templates
                        def add(x, y):
                           return x + y
                        template.execute(add=add)

                        ### The template
                        {{ add(1, 2) }}




Friday, June 10, 2011
Lies, damn lies and benchmarks




Friday, June 10, 2011
Saving data
Friday, June 10, 2011
MongoDB is an object
                             database

                        • No schema - anything that can be a JSON
                          object can be stored
                        • You can define new collections on the fly


Friday, June 10, 2011
Getting started with
                           Mongo in 4 steps
                        • Download a binary for your system
                        • Create a data directory (mkdir -p /data/db)
                        • Run mongod
                        • Install pymongo
                        • ... start writing code!

Friday, June 10, 2011
Pymongo code sample
              connection = pymongo.Connection()
              database = connection["your_database"]

              def get_or_create_location_by_id(location_id):
                  """
                      Attempts to fetch location data from database. If it doesn't exist,
                      create it. Note that this is NOT concurrency safe.
                  """
                  location_data = database["locations"].find_one({ "_id" : location_id })
                  if location_data is None:
                      location_data = {   "_id" : location_id,
                                          "guards": [],
                                          "owner" : None,
                                          "history" : [],
                                          "last_extort_time" : None
                                       }
                      database.location.save(location_data, safe=True)
                  return location_data




Friday, June 10, 2011
Pymongo queries
              # Add Tyson as a guard to every location owned by “Joe Smith”
              locations = database["locations"].find({ "owner" : "Joe Smith" })
              for location in locations:
                 location["guards"].append("Tyson")
                 database["locations"].save(location)

              # Find everyone who has Tyson as a guard
              locations = database["locations"].find({"guards" : "Tyson"})

              # Find everyone who has *ONLY* Tyson as a guard
              locations = database["locations"].find({"guards" : ["Tyson"]}) # Note []s

              # Find everyone who has Tyson as a guard whose owner is “Ikai Lan”
              locations = database["locations"].find({"guards" : "Tyson",
                                                      "owner" : "Ikai Lan" })




Friday, June 10, 2011
Mold as you go along
Friday, June 10, 2011
Freedom from

                        • ... waiting to get started
                        • ... predefining a schema
                        • ... worrying about complex data structures
                          that don’t fit well into the SQL box.
                          Anything that is JSON can be stored!



Friday, June 10, 2011
More MongoDB
                                 features
                        • Simple Geospatial indexing
                        • GridFS - distributed filesystem running on
                          MongoDB
                        • Out of the box mapreduce
                        • Out of the box replication, data partitioning

Friday, June 10, 2011
Putting it all together
                        • MobSquare, a location based game that
                          uses the Facebook API.
                        • Mashup: Mafia Wars + FourSquare
                        • https://github.com/ikai/mobsquare-demo
                        • “Check in” to locations, take them over,
                          extort money and fight other gangs


Friday, June 10, 2011
Why are Tornado/
                             Mongo a fit?
                        • If I haven’t said it enough yet, they’re fun
                        • Facebook API performance varies -
                          asynchronous so we can serve requests
                          while waiting
                        • Highly structured player data

Friday, June 10, 2011
OAuth 2 upgrade flow
                        class OnLoginHandler(tornado.web.RequestHandler):

                            @tornado.web.asynchronous
                            def get(self):
                                # Store this somewhere
                                code = self.get_argument("code")
                                access_token_url = ACCESS_TOKEN_URL_TPL + code
                                client = httpclient.AsyncHTTPClient()
                                client.fetch(access_token_url, self.on_fetched_token)

                            def on_fetched_token(self, response):
                                """ Callback inokved when the auth_token is fetched """
                                matches = ACCESS_TOKEN_REGEX.search(response.body)
                                if matches:
                                    access_token = matches.group(1)
                                    client = httpclient.AsyncHTTPClient()
                                    # lambda is effectively a function factory for us
                                    client.fetch(API["profile"] % access_token,
                                        lambda response: self.on_profile_fetch(response, access_token))

                            def on_profile_fetch(self, response, access_token):
                                """ Callback invoked when we have fetched the user's profile """
                                profile = json.loads(response.body)
                                profile["access_token"] = access_token
                                profile_id = db.save_profile(profile)
                                self.set_secure_cookie("user_id", str(profile_id))
                                self.redirect("/") # implictly calls self.finish()



Friday, June 10, 2011
Known gotchas

                        • Immaturity of frameworks, tools
                        • Tornado templating errors result in
                          somewhat useless stack traces
                        • MongoDB nuances
                        • Tornado community fairly small

Friday, June 10, 2011
Questions?

                        • Ikai Lan - @ikai on Twitter
                        • Github: https://github.com/ikai
                        • Google Profile: https://profiles.google.com/
                          ikai.lan/about
                        • Thank you for having me at Pycon!

Friday, June 10, 2011
Attributions

                        •   Slide 6: Kirstin Jennings - “big smile!” http://www.flickr.com/photos/methyl_lives/2973265796/

                        •   Slide 8: Tony Blay - “I am a bird now!” http://www.flickr.com/photos/toniblay/59415205/

                        •   Slide 12: Antonio Sofi - “whirlwind” http://www.flickr.com/photos/webgol/36546734

                        •   Slide 17: Tornado Web documentation - http://www.tornadoweb.org/documentation

                        •   Slide 18: Christine of Robot Brainz - “Cassette” http://www.flickr.com/photos/robotbrainz/
                            2786347158/

                        •   Slide 23: Samuel Stroube - “Play-Doh on a Picnic Table” http://www.flickr.com/photos/samoube/
                            203586664




Friday, June 10, 2011

More Related Content

What's hot

A million connections and beyond - Node.js at scale
A million connections and beyond - Node.js at scaleA million connections and beyond - Node.js at scale
A million connections and beyond - Node.js at scale
Tom Croucher
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
Tom Croucher
 
Building servers with Node.js
Building servers with Node.jsBuilding servers with Node.js
Building servers with Node.js
ConFoo
 

What's hot (20)

Nodejs Explained with Examples
Nodejs Explained with ExamplesNodejs Explained with Examples
Nodejs Explained with Examples
 
Introduction to Nodejs
Introduction to NodejsIntroduction to Nodejs
Introduction to Nodejs
 
Building a real life application in node js
Building a real life application in node jsBuilding a real life application in node js
Building a real life application in node js
 
A million connections and beyond - Node.js at scale
A million connections and beyond - Node.js at scaleA million connections and beyond - Node.js at scale
A million connections and beyond - Node.js at scale
 
What is nodejs
What is nodejsWhat is nodejs
What is nodejs
 
rake puppetexpert:create - Puppet Camp Silicon Valley 2014
rake puppetexpert:create - Puppet Camp Silicon Valley 2014rake puppetexpert:create - Puppet Camp Silicon Valley 2014
rake puppetexpert:create - Puppet Camp Silicon Valley 2014
 
node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backend
 
introduction to node.js
introduction to node.jsintroduction to node.js
introduction to node.js
 
Event loop
Event loopEvent loop
Event loop
 
How do event loops work in Python?
How do event loops work in Python?How do event loops work in Python?
How do event loops work in Python?
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
 
Node.js - Best practices
Node.js  - Best practicesNode.js  - Best practices
Node.js - Best practices
 
Async programming and python
Async programming and pythonAsync programming and python
Async programming and python
 
Node.js - A Quick Tour
Node.js - A Quick TourNode.js - A Quick Tour
Node.js - A Quick Tour
 
Kotlin from-scratch 3 - coroutines
Kotlin from-scratch 3 - coroutinesKotlin from-scratch 3 - coroutines
Kotlin from-scratch 3 - coroutines
 
Building servers with Node.js
Building servers with Node.jsBuilding servers with Node.js
Building servers with Node.js
 
Original slides from Ryan Dahl's NodeJs intro talk
Original slides from Ryan Dahl's NodeJs intro talkOriginal slides from Ryan Dahl's NodeJs intro talk
Original slides from Ryan Dahl's NodeJs intro talk
 
Node.js Event Loop & EventEmitter
Node.js Event Loop & EventEmitterNode.js Event Loop & EventEmitter
Node.js Event Loop & EventEmitter
 
Node.js
Node.jsNode.js
Node.js
 
Node.js in production
Node.js in productionNode.js in production
Node.js in production
 

Viewers also liked (7)

An Introduction to Tornado
An Introduction to TornadoAn Introduction to Tornado
An Introduction to Tornado
 
Real time server
Real time serverReal time server
Real time server
 
Programmation web asynchrone avec Tornado
Programmation web asynchrone avec TornadoProgrammation web asynchrone avec Tornado
Programmation web asynchrone avec Tornado
 
Tornado
TornadoTornado
Tornado
 
Tornado
TornadoTornado
Tornado
 
Introduction to Tornado - TienNA
Introduction to Tornado - TienNAIntroduction to Tornado - TienNA
Introduction to Tornado - TienNA
 
Contoh Lembar Catatan Fakta Guru
Contoh Lembar Catatan Fakta GuruContoh Lembar Catatan Fakta Guru
Contoh Lembar Catatan Fakta Guru
 

Similar to Rapid web development using tornado web and mongodb

Large problems, Mostly Solved
Large problems, Mostly SolvedLarge problems, Mostly Solved
Large problems, Mostly Solved
ericholscher
 
Mongo db with spring data document
Mongo db with spring data documentMongo db with spring data document
Mongo db with spring data document
Sean Lee
 
IPTC News in JSON Spring 2013
IPTC News in JSON Spring 2013IPTC News in JSON Spring 2013
IPTC News in JSON Spring 2013
Stuart Myles
 
The Solar Framework for PHP
The Solar Framework for PHPThe Solar Framework for PHP
The Solar Framework for PHP
ConFoo
 
international PHP2011_ilia alshanetsky_Hidden Features of PHP
international PHP2011_ilia alshanetsky_Hidden Features of PHPinternational PHP2011_ilia alshanetsky_Hidden Features of PHP
international PHP2011_ilia alshanetsky_Hidden Features of PHP
smueller_sandsmedia
 
SXSW 2012 JavaScript MythBusters
SXSW 2012 JavaScript MythBustersSXSW 2012 JavaScript MythBusters
SXSW 2012 JavaScript MythBusters
Elena-Oana Tabaranu
 
Getting Started with Wonder
Getting Started with WonderGetting Started with Wonder
Getting Started with Wonder
WO Community
 

Similar to Rapid web development using tornado web and mongodb (20)

Pycon2011 android programming-using_python
Pycon2011 android programming-using_pythonPycon2011 android programming-using_python
Pycon2011 android programming-using_python
 
Large problems, Mostly Solved
Large problems, Mostly SolvedLarge problems, Mostly Solved
Large problems, Mostly Solved
 
Mongo db with spring data document
Mongo db with spring data documentMongo db with spring data document
Mongo db with spring data document
 
IPTC News in JSON Spring 2013
IPTC News in JSON Spring 2013IPTC News in JSON Spring 2013
IPTC News in JSON Spring 2013
 
So, you think you know widgets.
So, you think you know widgets.So, you think you know widgets.
So, you think you know widgets.
 
Railsconf 2010
Railsconf 2010Railsconf 2010
Railsconf 2010
 
Beyond Fluffy Bunny. How I leveraged WebObjects in my lean startup.
Beyond Fluffy Bunny. How I leveraged WebObjects in my lean startup.Beyond Fluffy Bunny. How I leveraged WebObjects in my lean startup.
Beyond Fluffy Bunny. How I leveraged WebObjects in my lean startup.
 
Flowdock's full-text search with MongoDB
Flowdock's full-text search with MongoDBFlowdock's full-text search with MongoDB
Flowdock's full-text search with MongoDB
 
Getting Started with Dojo Toolkit
Getting Started with Dojo ToolkitGetting Started with Dojo Toolkit
Getting Started with Dojo Toolkit
 
The Solar Framework for PHP
The Solar Framework for PHPThe Solar Framework for PHP
The Solar Framework for PHP
 
What is Python?
What is Python?What is Python?
What is Python?
 
Yahoo is open to developers
Yahoo is open to developersYahoo is open to developers
Yahoo is open to developers
 
잘 알려지지 않은 Php 코드 활용하기
잘 알려지지 않은 Php 코드 활용하기잘 알려지지 않은 Php 코드 활용하기
잘 알려지지 않은 Php 코드 활용하기
 
international PHP2011_ilia alshanetsky_Hidden Features of PHP
international PHP2011_ilia alshanetsky_Hidden Features of PHPinternational PHP2011_ilia alshanetsky_Hidden Features of PHP
international PHP2011_ilia alshanetsky_Hidden Features of PHP
 
SXSW 2012 JavaScript MythBusters
SXSW 2012 JavaScript MythBustersSXSW 2012 JavaScript MythBusters
SXSW 2012 JavaScript MythBusters
 
The goodies of zope, pyramid, and plone (2)
The goodies of zope, pyramid, and plone (2)The goodies of zope, pyramid, and plone (2)
The goodies of zope, pyramid, and plone (2)
 
Getting Started with Wonder
Getting Started with WonderGetting Started with Wonder
Getting Started with Wonder
 
App Engine Meetup
App Engine MeetupApp Engine Meetup
App Engine Meetup
 
Plone - A History of Python Web
Plone - A History of Python WebPlone - A History of Python Web
Plone - A History of Python Web
 
Entity Framework Today (May 2012)
Entity Framework Today (May 2012)Entity Framework Today (May 2012)
Entity Framework Today (May 2012)
 

More from ikailan

2011 july-gtug-high-replication-datastore
2011 july-gtug-high-replication-datastore2011 july-gtug-high-replication-datastore
2011 july-gtug-high-replication-datastore
ikailan
 
What is App Engine? O
What is App Engine? OWhat is App Engine? O
What is App Engine? O
ikailan
 
Building TweetEngine
Building TweetEngineBuilding TweetEngine
Building TweetEngine
ikailan
 

More from ikailan (14)

Your language doesn't scale
Your language doesn't scaleYour language doesn't scale
Your language doesn't scale
 
From 0-1 billion in 46 days
From 0-1 billion in 46 daysFrom 0-1 billion in 46 days
From 0-1 billion in 46 days
 
2011 august-gdd-mexico-city-rest-json-oauth
2011 august-gdd-mexico-city-rest-json-oauth2011 august-gdd-mexico-city-rest-json-oauth
2011 august-gdd-mexico-city-rest-json-oauth
 
2011 aug-gdd-mexico-city-high-replication-datastore
2011 aug-gdd-mexico-city-high-replication-datastore2011 aug-gdd-mexico-city-high-replication-datastore
2011 aug-gdd-mexico-city-high-replication-datastore
 
2011 july-nyc-gtug-go
2011 july-nyc-gtug-go2011 july-nyc-gtug-go
2011 july-nyc-gtug-go
 
2011 july-gtug-high-replication-datastore
2011 july-gtug-high-replication-datastore2011 july-gtug-high-replication-datastore
2011 july-gtug-high-replication-datastore
 
Intro to App Engine - Agency Dev Day NYC 2011
Intro to App Engine - Agency Dev Day NYC 2011Intro to App Engine - Agency Dev Day NYC 2011
Intro to App Engine - Agency Dev Day NYC 2011
 
2011 june-kuala-lumpur-gtug-hackathon
2011 june-kuala-lumpur-gtug-hackathon2011 june-kuala-lumpur-gtug-hackathon
2011 june-kuala-lumpur-gtug-hackathon
 
2011 June - Singapore GTUG presentation. App Engine program update + intro to Go
2011 June - Singapore GTUG presentation. App Engine program update + intro to Go2011 June - Singapore GTUG presentation. App Engine program update + intro to Go
2011 June - Singapore GTUG presentation. App Engine program update + intro to Go
 
Introducing the App Engine datastore
Introducing the App Engine datastoreIntroducing the App Engine datastore
Introducing the App Engine datastore
 
What is App Engine? O
What is App Engine? OWhat is App Engine? O
What is App Engine? O
 
OSCON Google App Engine Codelab - July 2010
OSCON Google App Engine Codelab - July 2010OSCON Google App Engine Codelab - July 2010
OSCON Google App Engine Codelab - July 2010
 
Boot camp 2010_app_engine_101
Boot camp 2010_app_engine_101Boot camp 2010_app_engine_101
Boot camp 2010_app_engine_101
 
Building TweetEngine
Building TweetEngineBuilding TweetEngine
Building TweetEngine
 

Recently uploaded

Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
Bhaskar Mitra
 

Recently uploaded (20)

The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
Quantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIsQuantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIs
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
НАДІЯ ФЕДЮШКО БАЦ «Професійне зростання QA спеціаліста»
НАДІЯ ФЕДЮШКО БАЦ  «Професійне зростання QA спеціаліста»НАДІЯ ФЕДЮШКО БАЦ  «Професійне зростання QA спеціаліста»
НАДІЯ ФЕДЮШКО БАЦ «Професійне зростання QA спеціаліста»
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
 
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxIOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
 
Demystifying gRPC in .Net by John Staveley
Demystifying gRPC in .Net by John StaveleyDemystifying gRPC in .Net by John Staveley
Demystifying gRPC in .Net by John Staveley
 
In-Depth Performance Testing Guide for IT Professionals
In-Depth Performance Testing Guide for IT ProfessionalsIn-Depth Performance Testing Guide for IT Professionals
In-Depth Performance Testing Guide for IT Professionals
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
UiPath Test Automation using UiPath Test Suite series, part 2
UiPath Test Automation using UiPath Test Suite series, part 2UiPath Test Automation using UiPath Test Suite series, part 2
UiPath Test Automation using UiPath Test Suite series, part 2
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
Speed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in MinutesSpeed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in Minutes
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 

Rapid web development using tornado web and mongodb

  • 1. Rapid Web Development with Tornado Web and MongoDB Ikai Lan Twitter: @ikai Friday, June 10, 2011
  • 2. About the speaker • Developer Relations at Google • Software Engineering background • Lives in San Francisco, CA • Writes Java, Python on a day to day basis • Twitter: @ikai Friday, June 10, 2011
  • 3. This talk • Why Tornado Web and MongoDB? • Whirlwind tour of Tornado (get it?!) • Intro to MongoDB • Brief look at a demo app Friday, June 10, 2011
  • 4. What I won’t be talking about • Scalability - loaded topic • Reliability - another loaded topic Friday, June 10, 2011
  • 5. So why tornado/ mongo? Friday, June 10, 2011
  • 7. Where does this joy come from? Friday, June 10, 2011
  • 9. So really, my talk should have been called “The Joy of Tornado Web and Mongo DB” Friday, June 10, 2011
  • 10. Intangibles • Tornado - fast development, very few rules • MongoDB - freedom from a predefined schema • Python, of course. Dynamically typed variables, duck typing plus everything else that is cool about the language Friday, June 10, 2011
  • 11. Tornado Web history • Open Sourced by Facebook • ... formerly of FriendFeed • ... former Googlers (that’s why the framework looks like App Engine’s webapp - they wrote it) • Tornado Web powers FriendFeed Friday, June 10, 2011
  • 12. A whirlwind tour Friday, June 10, 2011
  • 13. Tornado features • Out of the box auth with Twitter, Facebook, Google and FriendFeed • Out of box support for localized strings • Simple templating that allows arbitrary Python code • Asynchronous requests • Small codebase Friday, June 10, 2011
  • 14. Simple handlers import tornado.ioloop import tornado.web class HelloHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world :)") class GoodbyeHandler(tornado.web.RequestHandler): def get(self): self.render("goodbye.html", message=”Goodbye, world”) application = tornado.web.Application([ (r"/hello", HelloHandler), (r"/goodbye", GoodbyeHandler), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start() Friday, June 10, 2011
  • 15. Asynchronous nature class MainHandler(tornado.web.RequestHandler): @tornado.web.asynchronous def get(self): http = tornado.httpclient.AsyncHTTPClient() http.fetch("http://friendfeed-api.com/v2/feed/bret", callback=self.on_response) def on_response(self, response): if response.error: raise tornado.web.HTTPError(500) json = tornado.escape.json_decode(response.body) self.write("Fetched " + str(len(json["entries"])) + " entries " "from the FriendFeed API") self.finish() Friday, June 10, 2011
  • 16. Unrestrictive templating {% for student in [p for p in people if p.student and p.age > 23] %} <li>{{ escape(student.name) }}</li> {% end %} # Sample of arbitrary functions in templates def add(x, y): return x + y template.execute(add=add) ### The template {{ add(1, 2) }} Friday, June 10, 2011
  • 17. Lies, damn lies and benchmarks Friday, June 10, 2011
  • 19. MongoDB is an object database • No schema - anything that can be a JSON object can be stored • You can define new collections on the fly Friday, June 10, 2011
  • 20. Getting started with Mongo in 4 steps • Download a binary for your system • Create a data directory (mkdir -p /data/db) • Run mongod • Install pymongo • ... start writing code! Friday, June 10, 2011
  • 21. Pymongo code sample connection = pymongo.Connection() database = connection["your_database"] def get_or_create_location_by_id(location_id): """ Attempts to fetch location data from database. If it doesn't exist, create it. Note that this is NOT concurrency safe. """ location_data = database["locations"].find_one({ "_id" : location_id }) if location_data is None: location_data = { "_id" : location_id, "guards": [], "owner" : None, "history" : [], "last_extort_time" : None } database.location.save(location_data, safe=True) return location_data Friday, June 10, 2011
  • 22. Pymongo queries # Add Tyson as a guard to every location owned by “Joe Smith” locations = database["locations"].find({ "owner" : "Joe Smith" }) for location in locations: location["guards"].append("Tyson") database["locations"].save(location) # Find everyone who has Tyson as a guard locations = database["locations"].find({"guards" : "Tyson"}) # Find everyone who has *ONLY* Tyson as a guard locations = database["locations"].find({"guards" : ["Tyson"]}) # Note []s # Find everyone who has Tyson as a guard whose owner is “Ikai Lan” locations = database["locations"].find({"guards" : "Tyson", "owner" : "Ikai Lan" }) Friday, June 10, 2011
  • 23. Mold as you go along Friday, June 10, 2011
  • 24. Freedom from • ... waiting to get started • ... predefining a schema • ... worrying about complex data structures that don’t fit well into the SQL box. Anything that is JSON can be stored! Friday, June 10, 2011
  • 25. More MongoDB features • Simple Geospatial indexing • GridFS - distributed filesystem running on MongoDB • Out of the box mapreduce • Out of the box replication, data partitioning Friday, June 10, 2011
  • 26. Putting it all together • MobSquare, a location based game that uses the Facebook API. • Mashup: Mafia Wars + FourSquare • https://github.com/ikai/mobsquare-demo • “Check in” to locations, take them over, extort money and fight other gangs Friday, June 10, 2011
  • 27. Why are Tornado/ Mongo a fit? • If I haven’t said it enough yet, they’re fun • Facebook API performance varies - asynchronous so we can serve requests while waiting • Highly structured player data Friday, June 10, 2011
  • 28. OAuth 2 upgrade flow class OnLoginHandler(tornado.web.RequestHandler): @tornado.web.asynchronous def get(self): # Store this somewhere code = self.get_argument("code") access_token_url = ACCESS_TOKEN_URL_TPL + code client = httpclient.AsyncHTTPClient() client.fetch(access_token_url, self.on_fetched_token) def on_fetched_token(self, response): """ Callback inokved when the auth_token is fetched """ matches = ACCESS_TOKEN_REGEX.search(response.body) if matches: access_token = matches.group(1) client = httpclient.AsyncHTTPClient() # lambda is effectively a function factory for us client.fetch(API["profile"] % access_token, lambda response: self.on_profile_fetch(response, access_token)) def on_profile_fetch(self, response, access_token): """ Callback invoked when we have fetched the user's profile """ profile = json.loads(response.body) profile["access_token"] = access_token profile_id = db.save_profile(profile) self.set_secure_cookie("user_id", str(profile_id)) self.redirect("/") # implictly calls self.finish() Friday, June 10, 2011
  • 29. Known gotchas • Immaturity of frameworks, tools • Tornado templating errors result in somewhat useless stack traces • MongoDB nuances • Tornado community fairly small Friday, June 10, 2011
  • 30. Questions? • Ikai Lan - @ikai on Twitter • Github: https://github.com/ikai • Google Profile: https://profiles.google.com/ ikai.lan/about • Thank you for having me at Pycon! Friday, June 10, 2011
  • 31. Attributions • Slide 6: Kirstin Jennings - “big smile!” http://www.flickr.com/photos/methyl_lives/2973265796/ • Slide 8: Tony Blay - “I am a bird now!” http://www.flickr.com/photos/toniblay/59415205/ • Slide 12: Antonio Sofi - “whirlwind” http://www.flickr.com/photos/webgol/36546734 • Slide 17: Tornado Web documentation - http://www.tornadoweb.org/documentation • Slide 18: Christine of Robot Brainz - “Cassette” http://www.flickr.com/photos/robotbrainz/ 2786347158/ • Slide 23: Samuel Stroube - “Play-Doh on a Picnic Table” http://www.flickr.com/photos/samoube/ 203586664 Friday, June 10, 2011