1

呼び出しを認証するためのデコレータを作成しました。引数が1つしかない場合は正常に機能しますが、引数が1つを超えると機能せず、。がトリガーされますinner() takes exactly 1 argument (2 given)。トルネードを使用しているので、コールバックスパゲッティが少しありますが、これを行うための最良の方法がわかりません。

#this works
class FirstHandler(BaseHandler):

    @asynchronous
    @oauth_machine.auth
    def post(self):
        print self.user
        self.finish()

#this now also does
class SecondHandler(BaseHandler):

    @asynchronous
    @oauth_machine.auth
    def get(self, args):
        self.write("ok")
        self.finish()

デコレータ関数

def auth(fn):
    def inner(self, *args):
        res = get_user_by_credentials(self, fn, args, callback=done_auth)
    return inner

def get_user_by_credentials(self, fn, callback):

    def onFetchUserCredentials(result, error):
        self.user = result
        callback(self, fn, args)

    email = self.get_argument("email")
    password = self.get_argument("password")
    settings.DB.users.find_one({'email': email, 'password': password }, callback=onFetchUserCredentials)

def done_auth(result, fn, args):
    return fn(result, args)

編集 :

コードを動作バージョンに更新しました。

ありがとう!

4

1 に答える 1

2

最初は問題は非常に単純だと思いましたが、元のエラーメッセージと矛盾するトレースバックを投稿しました。ただし、トレースバックエラーが正しいものであると仮定すると、問題はまだかなり単純だと思います。これを思い出してください:

@decorator
def foo(x):
    return x + 1

これは単に構文糖衣です:

def foo(x):
    return x + 1
foo = oauth_machine.auth(foo)

したがって、で使用する@oauth_machine.authget、クロージャーを介してinnerasに渡されfnます。

def auth(fn):
    def inner(self):
        res = get_user_by_credentials(self, fn, callback=done_auth)
    return inner

get_user_by_credentials次に、再びとしてに渡され、次にfn別のクロージャが生成され、がに渡さfncallbackます。

def get_user_by_credentials(self, fn, callback):

    def onFetchUserCredentials(result, error):
        self.user = result
        callback(self, fn)

callbackdone_authに戻って定義されたinnerので、そのメナスfn(つまり元のget)がそこに渡され、次に呼び出されresultます:

def done_auth(result, fn):
    return fn(result)

しかし、fn(すなわちget)は2つの引数を取ります。1つだけ渡すと、エラーが発生します。

于 2012-11-17T02:18:06.017 に答える