1

私は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ですか?

4

1 に答える 1

3

これを確認した後、おそらくバグだと思いました。サンプル コードを python-tornado Google グループのこのスレッドに投稿すると、https: //groups.google.com/forum/? fromgroups#!topic/python-tornado/YypdSaXsM_Y で確認されました。

auth*_redirect メソッドは Future を返さないため、生成することはできませんが、生成する必要があります。現時点での回避策として、引き続き @gen.engine を使用し、譲歩せずにこれらのメソッドを呼び出すことができます。

于 2013-05-29T15:27:32.977 に答える