/demos/twitter/twitterdemo.py

https://gitlab.com/0072016/Id-Facebook-name-SDK- · Python · 93 lines · 87 code · 0 blank · 6 comment · 4 complexity · 6d96cfa3ee195f2859d68039509a01b4 MD5 · raw file

  1. #!/usr/bin/env python
  2. """A simplistic Twitter viewer to demonstrate the use of TwitterMixin.
  3. To run this app, you must first register an application with Twitter:
  4. 1) Go to https://dev.twitter.com/apps and create an application.
  5. Your application must have a callback URL registered with Twitter.
  6. It doesn't matter what it is, but it has to be there (Twitter won't
  7. let you use localhost in a registered callback URL, but that won't stop
  8. you from running this demo on localhost).
  9. 2) Create a file called "secrets.cfg" and put your consumer key and
  10. secret (which Twitter gives you when you register an app) in it:
  11. twitter_consumer_key = 'asdf1234'
  12. twitter_consumer_secret = 'qwer5678'
  13. (you could also generate a random value for "cookie_secret" and put it
  14. in the same file, although it's not necessary to run this demo)
  15. 3) Run this program and go to http://localhost:8888 (by default) in your
  16. browser.
  17. """
  18. import logging
  19. from tornado.auth import TwitterMixin
  20. from tornado.escape import json_decode, json_encode
  21. from tornado.ioloop import IOLoop
  22. from tornado import gen
  23. from tornado.options import define, options, parse_command_line, parse_config_file
  24. from tornado.web import Application, RequestHandler, authenticated
  25. define('port', default=8888, help="port to listen on")
  26. define('config_file', default='secrets.cfg',
  27. help='filename for additional configuration')
  28. define('debug', default=False, group='application',
  29. help="run in debug mode (with automatic reloading)")
  30. # The following settings should probably be defined in secrets.cfg
  31. define('twitter_consumer_key', type=str, group='application')
  32. define('twitter_consumer_secret', type=str, group='application')
  33. define('cookie_secret', type=str, group='application',
  34. default='__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE__',
  35. help="signing key for secure cookies")
  36. class BaseHandler(RequestHandler):
  37. COOKIE_NAME = 'twitterdemo_user'
  38. def get_current_user(self):
  39. user_json = self.get_secure_cookie(self.COOKIE_NAME)
  40. if not user_json:
  41. return None
  42. return json_decode(user_json)
  43. class MainHandler(BaseHandler, TwitterMixin):
  44. @authenticated
  45. @gen.coroutine
  46. def get(self):
  47. timeline = yield self.twitter_request(
  48. '/statuses/home_timeline',
  49. access_token=self.current_user['access_token'])
  50. self.render('home.html', timeline=timeline)
  51. class LoginHandler(BaseHandler, TwitterMixin):
  52. @gen.coroutine
  53. def get(self):
  54. if self.get_argument('oauth_token', None):
  55. user = yield self.get_authenticated_user()
  56. del user["description"]
  57. self.set_secure_cookie(self.COOKIE_NAME, json_encode(user))
  58. self.redirect(self.get_argument('next', '/'))
  59. else:
  60. yield self.authorize_redirect(callback_uri=self.request.full_url())
  61. class LogoutHandler(BaseHandler):
  62. def get(self):
  63. self.clear_cookie(self.COOKIE_NAME)
  64. def main():
  65. parse_command_line(final=False)
  66. parse_config_file(options.config_file)
  67. app = Application(
  68. [
  69. ('/', MainHandler),
  70. ('/login', LoginHandler),
  71. ('/logout', LogoutHandler),
  72. ],
  73. login_url='/login',
  74. **options.group_dict('application'))
  75. app.listen(options.port)
  76. logging.info('Listening on http://localhost:%d' % options.port)
  77. IOLoop.instance().start()
  78. if __name__ == '__main__':
  79. main()