2015-12-22 58 views
-1

我目前正在使用龙卷风来显示我的Twitter流。下面是我的代码:龙卷风验证(Twittermixin)问题

#!/usr/bin/env python 
import time 
import logging 
from tornado.auth import TwitterMixin 
from tornado.escape import json_decode, json_encode 
from tornado.ioloop import IOLoop 
from tornado import gen 
from tornado.options import define, options, parse_command_line, parse_config_file 
from tornado.web import Application, RequestHandler, authenticated, HTTPError 

define('port', default=8080, help="port to listen on") 
define('config_file', default='secrets.cfg', 
     help='filename for additional configuration') 

define('debug', default=True, group='application', 
     help="run in debug mode (with automatic reloading)") 
# The following settings should probably be defined in secrets.cfg 
define('twitter_consumer_key', type=str, group='application') 
define('twitter_consumer_secret', type=str, group='application') 
define('cookie_secret', type=str, group='application', 
     default='this is a string', 
     help="signing key for secure cookies") 

class BaseHandler(RequestHandler): 
    COOKIE_NAME = "uuser" 
    def get_current_user(self): 
     user_json = self.get_secure_cookie(self.COOKIE_NAME) 
     if not user_json: 
      print(" No user_json") 
      return None 
     print(" Yes user_json") 
     return json_decode(user_json) 

class MainHandler(BaseHandler, TwitterMixin): 
    @authenticated 
    @gen.coroutine 
    def get(self): 
     timeline = yield self.twitter_request(
      '/statuses/home_timeline', 
      access_token = self.current_user['access_token']) 
     self.render('home.html', timeline=timeline) 

class LoginHandler(BaseHandler, TwitterMixin): 
    @gen.coroutine 
    def get(self): 
     if self.get_argument('oauth_token', None): 
      user = yield self.get_authenticated_user() 
      print(' user:', type(user)) 
      del user["description"] 
      self.set_secure_cookie(self.COOKIE_NAME, json_encode(user)) 
      print(' get_secure_cookie:', self.get_secure_cookie(self.COOKIE_NAME)) 
      self.redirect(self.get_argument('next', '/')) 
     else: 
      print(" Authorize_redirecting...") 
      yield self.authorize_redirect(callback_uri=self.request.full_url()) 

class LogoutHandler(BaseHandler): 
    def get(self): 
     self.clear_cookie("user") 

def main(): 
    parse_command_line(final=False) 
    parse_config_file(options.config_file) 

    app = Application(
     [ 
      (r'/', MainHandler), 
      (r'/login', LoginHandler), 
      (r'/logout', LogoutHandler), 
     ], 
     login_url='/login', 
     **options.group_dict('application')) 
    app.listen(options.port) 

    logging.info('Listening on http://localhost:%d' % options.port) 
    IOLoop.current().start() 

if __name__ == '__main__': 
    main() 

所以我流的理解如下:

1)访问“/” - MainHandler,该@authenticated将重定向到login_url如果用户没有登录。

2)访问 '/登录' - LoginHandler,self.authorize_redirect(callback_uri=self.request.full_url())将在URL的末尾添加的oauth_token参数,并重新访问 '/登录'

3)访问 '/登录' - LoginHandler,获得用户self.get_authenticated_user(),和set_secure_cookie(self.COOKIE_NAME, json_encode(user))

这里是我想这个问题,我似乎无法设置Cookie。当我尝试立即self.get_secure_cookie(self.COOKIE_NAME)访问它,它返回None,因此,不断重新访问“/登录”

任何人能提供给我的问题有所帮助?也许这是非常明显的,我没有看到。由于

我还设置http://127.0.0.1:8080/作为回调URL我的Twitter的应用程序设置,不知道这是否有该问题的任何贡献。

+0

好吧,我相信'set_secure_cookie(名称= self.COOKIE_NAME,值= json_encode(用户))'是问题的原因,它从来没有设法设置cookie的在我的浏览器。我已经检查了'user'对象存在且是一个'dict'和'json_encode'不会返回一个字符串值...所以都必须有'set_secure_cookie'功能的东西.... – creampiedonut

回答

-2

最终的解决方案!

#!/usr/bin/env python 
import time 
import uuid 
import logging 
from tornado.auth import TwitterMixin 
from tornado.escape import json_decode, json_encode, url_escape, url_unescape 
from tornado.ioloop import IOLoop 
from tornado import gen 
from tornado.options import define, options, parse_command_line, parse_config_file 
from tornado.web import Application, RequestHandler, authenticated, HTTPError 
from urllib.parse import quote 
import re 

define('port', default=8080, help="port to listen on") 
define('config_file', default='secrets.cfg', 
     help='filename for additional configuration') 

define('debug', default=True, group='application', 
     help="run in debug mode (with automatic reloading)") 
# The following settings should probably be defined in secrets.cfg 
define('twitter_consumer_key', type=str, group='application') 
define('twitter_consumer_secret', type=str, group='application') 
# define('cookie_secret', type=str, group='application', 
#  default='thisisastring', 
#  help="signing key for secure cookies") 


class BaseHandler(RequestHandler): 
    COOKIE_NAME = "user" 
    def get_current_user(self): 
     user_json = self.get_cookie(self.COOKIE_NAME) 
     if not user_json: 
      print("\n - Cannot obtain cookie from client browser") 
      return None 
     print("\n - Cookie obtained from client browser") 
     return json_decode(user_json) 

class MainHandler(BaseHandler, TwitterMixin): 
    @authenticated 
    @gen.coroutine 
    def get(self): 
     print("\n - Obtaining timeline from twitter") 
     timeline = yield self.twitter_request(
      '/statuses/home_timeline', 
      access_token = self.current_user) 
     self.render('home.html', timeline=timeline) 

class LoginHandler(BaseHandler, TwitterMixin): 
    @gen.coroutine 
    def get(self): 
     if self.get_argument('oauth_token', None): 
      print("\n - Authenticating with oauth_token...") 
      user = yield self.get_authenticated_user() 
      encoded_token = json_encode(user['access_token']) 

      # remove certain ascii symbols which are rejected 
      # by self.set_cookie() function... 
      encoded_token = re.sub(r"[\x00-\x20]", '', encoded_token) 

      # save encoded token as cookie 
      self.set_cookie(name=self.COOKIE_NAME, value=encoded_token) 
      self.redirect(self.get_argument('next', '/')) 
     else: 
      print("\n - Authorize_redirecting...") 
      yield self.authorize_redirect(callback_uri=self.request.full_url()) 

class LogoutHandler(BaseHandler): 
    def get(self): 
     self.clear_cookie(self.COOKIE_NAME) 

def main(): 
    parse_command_line(final=False) 
    parse_config_file(options.config_file) 

    app = Application(
     [ 
      (r'/', MainHandler), 
      (r'/login', LoginHandler), 
      (r'/logout', LogoutHandler), 
     ], 
     login_url='/login', 
     cookie_secret=str(uuid.uuid4().bytes), 
     **options.group_dict('application')) 
    app.listen(options.port) 

    logging.info('Listening on http://localhost:%d' % options.port) 
    IOLoop.current().start() 

if __name__ == '__main__': 
    main()