Wenn ich get_current_user () verwende, muss ich einige Dinge in Redis ( tornado-redisis ) asynchron überprüfen.
Ich mache folgendes:
%Vor%Ich möchte zum Beispiel authenticated_async Decorator:
verwenden %Vor%Aber ich habe nur in der Konsole 123 .
Was ist los? Wie behebe ich das?
Danke!
AKTUALISIEREN
Ich habe den Code mit yield result
aktualisiert.
In auth_cookie habe ich cfae7a25-2b8b-46a6-b5c4-0083a114c40e
.
Dann gehe ich zum Terminal:
%Vor%Also,
%Vor%Muss zurückgegeben werden
%Vor%Aber es gibt eine 123
zurückUPDATE 1
Mit
%Vor%In der Konsole habe ich:
%Vor% get_secure_cookie()
gibt eine Byte-Zeichenfolge zurück; Da das Cookie mit einem b'
Präfix ausgedruckt wird, müssen Sie auf Python 3 sein. In Python 3 scheint tornado-redis
Unicode-Strings statt Byte-Strings zu erwarten; Jede Eingabe, die keine Unicode-Zeichenfolge ist, wird in eine mit der Funktion str()
konvertiert. Dadurch wird das oben angegebene b'
Präfix hinzugefügt, sodass Sie nach b'cfae7a25-2b8b-46a6-b5c4-0083a114c40e'
und nicht nach cfae7a25-2b8b-46a6-b5c4-0083a114c40e
Die Lösung besteht darin, das Cookie in ein str
zu konvertieren, bevor es an redis: auth_cookie = tornado.escape.native_str(auth_cookie)
Schauen Sie sich die Doc-Zeichenkette von gen.Task an:
Nimmt eine Funktion (und optionale zusätzliche Argumente) und führt sie mit diese Argumente plus ein
callback
Schlüsselwort-Argument.
Akzeptiert c.hget ein Callback-Argument? Ist dies nicht der Fall, löst der Callback eine Ausnahme aus, in der Zukunft wird kein Ergebnis festgelegt, daher druckt die print-Anweisung die Benutzer-ID nicht.
Die Antwort ist zurück in Ihrer Wrapper-Coroutine.
%Vor%Sie wollen kein Ergebnis liefern, sondern es von der Coroutine "zurückgeben". Da Python jedoch nicht die Verwendung einer nicht leeren Rückgabe von einem Generator zulässt, müssen Sie sie als umbrochene Ausnahme auslösen, die Tornado auspacken kann, und das Ergebnis an den Aufrufer übergeben ( get_current_user ) )
%Vor%Nachdem Sie das getan haben, sollten Sie feststellen, dass es funktioniert.