2012-01-25 5 views
3

Я хотел попробовать отправить запрос приложения из моего приложения Facebook пользователю, использующему Tornado Framework. Я следовал http://www.tornadoweb.org/documentation/auth.html, но я не знаю, как решить эту ошибку. Любые специалисты там? Благодаря!Tornado Framework (FacebookGraphMixin)

Error Log

Traceback (most recent call last): 
    File "send.py", line 36, in <module> 
    main() 
    File "send.py", line 33, in main 
    test.get(app_access_token, player_id) 
    File "send.py", line 15, in get 
    callback=self.async_callback(self._on_post)) 
AttributeError: 'Send' object has no attribute 'async_callback' 

Код

import tornado.auth 
import tornado.escape 
import tornado.httpserver 
import tornado.ioloop 
import tornado.options 
import tornado.web 
from tornado import httpclient 

class Send(tornado.auth.FacebookGraphMixin): 
    def get(self, app_access_token, player_id): 
     self.facebook_request(
      "/"+player_id+"/apprequests", 
      post_args={"message": "I am an app request from my Tornado application!"}, 
      access_token=app_access_token, 
      callback=self.async_callback(self._on_post)) 

    def _on_post(self, new_entry): 
     if not new_entry: 
      # Call failed; perhaps missing permission? 
      self.authorize_redirect() 
      return 
     self.finish("Posted a message!") 

def main(): 
    key = "xxxxxxxxxxx" 
    secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
    player_id = "100003395454290" #fake id 
    http_client = httpclient.HTTPClient() 
    response = http_client.fetch("https://graph.facebook.com/oauth/access_token?grant_type=client_credentials&client_id="+key+"&client_secret="+secret+"&redirect_uri=&code=") 
    app_access_token = response.body.replace("access_token=","") 

    test = Send() 
    test.get(app_access_token, player_id) 

if __name__ == "__main__": 
    main() 

ответ

0

Похоже, вы забыли подкласс tornado.web.RequestHandler. Изменение:

class Send(tornado.auth.FacebookGraphMixin): 

To:

class Send(tornado.web.RequestHandler, tornado.auth.FacebookGraphMixin): 
+0

Привет, Роб! Но есть ли способ сделать это без tornado.web.RequestHandler? – yori

+0

@yori, 'async_callback' - это метод этого' tornado.web.RequestHandler', поэтому вам нужно будет найти способ сделать это, не используя этот метод. –

+0

Просто интересно ... Как вы думаете, это возможно без использования tornado.web.RequestHandler? Мой босс сказал, что не использовать tornado.web.RequestHandler :(Я немного потерял почему. – yori

1

Хорошо, мой ответ не сразу ответить на вопрос OP еще. Но так как это отображается в верхних результатах поиска по ошибке AttributeError: 'XxxxxHandler' object has no attribute 'async_callback'

Стоит отметить, что при запуске Tornado v4.0 функция async_callback была удалена. Чтобы процитировать Backwards-compatibility notes:

Функции оболочки RequestHandler.async_callback и WebSocketHandler.async_callback были удалены; они устарели для долгое время из-за контекста стека (и, в последнее время, сопрограммы).