2016-03-25 9 views
0

私は竜巻を使用していると私は、このような単一のパラメータでのRequestHandlerを宣言:今、私はのために別のハンドラを追加URLパラメータ内の準備()関数を取得し、代わりにGETの()/ポスト()

class StuffHandler(RequestHandler): 
    def get(self, stuff_name): 
     ... 

app = Application([ 
    (r'/stuff/(.*)/public', StuffHandler) 
]) 

class PrivateStuffHandler(RequestHandler): 
    @tornado.web.authenticated 
    def get(self, stuff_name): 
     ... 

これはもちろんget_current_user()get()前に呼び出されます:認証されるユーザーが必要です'/stuff/(.*)/private'、。問題は、get_current_user()を実行するには、stuff_nameパラメータが必要です。

prepare()またはinitialize()という方法を使用することが考えられました。これはget_current_user()の前に呼び出されます。しかし、私はこれらの方法からstuff_nameにアクセスすることはできません。私はパラメータとしてstuff_nameを入れてみましたが、うまくいかなかったので、self.get_argument("stuff_name")を呼び出そうとしましたが、うまくいきませんでした。

prepare()メソッドからURLパラメータにアクセスするにはどうすればよいですか?

+0

あなたはそれをクラス変数に格納し、検索することができますか? self.stuff_name = stuff_nameのように? – lamirap

+0

@lamirapしかし、人が '/ stuff/a/private'や'/stuff/b/private'を訪れるとどうすれば検出できますか? self.stuff_nameは常に同じです...(または:変更時に​​どこで更新しますか?) – wil93

答えて

1

は、私がstraight to Tornado developersを尋ね、有用ユーザーは私がself.path_argsとクラスのどこからでも利用できるself.path_kwargsがあることに気付くました。

ので、prepare()法(あるいはget_current_user()法)から、私が行うことができます。

stuff_name = self.path_args[0] 
1

私はself.request.pathを使用して完全なパスを取得し、必要なパスの値を達成できると思います。最後に

+0

'prepare()'で使用できます。 –

+0

これは唯一の解決策かもしれません...しかし、それは非常に醜いです:( – wil93

+0

また、 '/ stuff /(.*)/ private''から'/private-stuff/*) '' '' prepare() 'の中のロジックを変更する必要はありますか? – wil93

関連する問題