2016-03-25 15 views
0

I Tornado verwenden und ich erklärte dies einen Request mit einem einzelnen Parameter wie:Get URL-Parameter innerhalb prepare() Funktion, statt get()/post()

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

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

Jetzt habe ich eine anderen Handler für '/stuff/(.*)/private', die den Benutzer authentifiziert werden muss: get_current_user() vor get() aufgerufen werden verursacht

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

Dies natürlich. Das Problem ist, dass, um get_current_user() ausführen zu können, ich den stuff_name Parameter kennen muss.

Also dachte ich, dass ich die prepare() oder die initialize() Methode verwenden kann, die vor get_current_user() aufgerufen wird. Ich kann jedoch nicht auf stuff_name von diesen Methoden zugreifen. Ich habe versucht stuff_name als Parameter zu setzen, aber es hat nicht funktioniert, dann habe ich versucht, self.get_argument("stuff_name") anzurufen, aber es hat auch nicht funktioniert.

Wie greife ich auf einen URL-Parameter von der prepare() Methode zu?

+0

Sie es in Klassenvariablen speichern könnten und es wieder? wie self.stuff_name = stuff_name? – lamirap

+0

@lamirap aber wie erkenne ich dann, wenn eine Person '/ stuff/a/private' oder'/stuff/b/private' besucht? Der self.stuff_name wird immer derselbe sein ... (Oder: wo aktualisiere ich ihn, wenn er sich ändert?) – wil93

Antwort

1

Ich denke, Sie können self.request.path verwenden, um den vollständigen Pfad zu erhalten, dann erreichen Sie den Wert in Pfad, den Sie benötigen.

+0

er kann in 'prepare()' verwendet werden. –

+0

Vielleicht ist dies die einzige Lösung ... Aber es ist sehr hässlich :( – wil93

+0

Auch: was passiert, wenn ich die Pfaddefinition von ''/ stuff /(.*)/ private'' in'/private-stuff/(. *) ''? Müsste ich die Logik in' prepare() 'ändern? – wil93