【发布时间】:2013-05-25 10:43:07
【问题描述】:
我是 Tornado 的新手,正在尝试让简单的 OAuth twitter 身份验证正常工作。根据文档,我需要按如下方式设置身份验证处理程序:
class TwitterAuthHandler(BaseHandler, tornado.auth.TwitterMixin):
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self):
if self.get_argument("oauth_token", None):
user = yield self.get_authenticated_user()
if not user:
raise tornado.web.HTTPError(500, "Twitter auth failed")
self.set_secure_cookie("twitter_user", user)
self.redirect("/")
else:
self.authenticate_redirect()
但是,当我运行此代码时,我得到了错误:
File "/Library/Python/2.7/site-packages/tornado/web.py", line 485, in redirect
raise Exception("Cannot redirect after headers have been written")
Exception: Cannot redirect after headers have been written
这似乎是因为异步调用没有正确运行,self.authenticate_redirect() 行引发了异常。如果我用@tornado.gen.engine 替换@tornado.gen.coroutine 一切正常。但是,我知道gen.engine 是旧的做事方式,应该首选gen.coroutine,因为它会返回未来。
我还尝试将对self.get_authenticated_user() 的调用封装在tornado.gen.Task() 中。我不确定何时需要使用 gen.Task() 进行包装,但在这种情况下这似乎没有任何区别。
这段代码有什么问题,为什么gen.coroutine 失败但gen.engine 工作?
【问题讨论】:
标签: python asynchronous twitter tornado coroutine