私は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.coroutine
と、@tornado.gen.engine
うまくいきます。ただし、これgen.engine
は古い方法でありgen.coroutine
、未来を返すため、優先する必要があることは理解しています。
への呼び出しをself.get_authenticated_user()
でラップすることも試みましたtornado.gen.Task()
。ラッピングがいつgen.Task()
必要になるかはわかりませんが、この場合は違いはないようです。
gen.coroutine
このコードの何が問題なのですか? また、失敗するのに機能するのはなぜgen.engine
ですか?