2017-07-31 14 views
2

私はTornadoを使用して同期メソッドで動作するログインページを作成しました。次に、非同期にしたいと思っています。私のコードで非同期ログイン竜巻

import tornado.ioloop 
import tornado.web 
import http 
import time 

class BaseHandler(tornado.web.RequestHandler): 
    def get_current_user(self): 
     return self.get_secure_cookie("user") 

class MainHandler(BaseHandler): 
    def get(self): 
     if not self.current_user: 
      self.redirect("/login") 
      return 
     name = tornado.escape.xhtml_escape(self.current_user) 
     self.write('<html>' 
    '<head> ' 
    '<title>WELCOME </title>' 
    '</head>' 
    '<body style="background:orange;"' 

    '<div align="center">' 
    '<div style="margin-top:200px;margin-bottom:10px;">' 
    '<span style="width:500px;color:black;font-size:30px;font-weight:bold;">WELCOME </span>' 
    '</div>' 
    '<div style="margin-bottom:5px;">'"Hello, " + name) 

class LoginHandler(BaseHandler): 
    def get(self): 
     self.write('<html><body><form action="/login" method="post">' 
        '<div><span style="width:100px;;height: 500px;color:black;font-size:60;font-weight:bold;">' 
        'LOGIN' 
        '<div><span style="width:100px;;height: 500px;color:purple;font-size:30;font-weight:bold;">' 
        'NAME <input type="text" name="name">' 
        '<div><span style="width:100px;height: 500px;color:purple;font-size:30;font-weight:bold;">PASSWORD</span><input style="width:150px;" type="password" name="password" id="password" value="">' 
        '</div>'     
        '<input type="submit" value="Sign in">' 
        '</form></body></html>') 

    def post(self): 
     self.set_secure_cookie("user", self.get_argument("name")) 
     time.sleep(10) 
     self.redirect("/") 

application = tornado.web.Application([ 
    (r"/", MainHandler), 
    (r"/login", LoginHandler), 
], cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__") 

application.listen(5000) 
tornado.ioloop.IOLoop.current().start() 

私は三つのクラスBaseHandlerMainHandlerLoginHandlerを持っています。だから私は、次のコードにすればいいの変化は何ですか。どんな助けもありがとう。ここasync/awaitの表記を使用して

答えて

0

、おそらくあなたのPythonのバージョンに合わせて適応:

class BaseHandler(tornado.web.RequestHandler): 
    async def get_current_user(self): 
     return await some_async_operation() 

    async def prepare(self): 
     self.current_user = await self.get_current_user() 

トルネードは、箱から出して非同期get_current_userを呼び出すことはありませんが、それは非同期prepare方法を尊重しますので、あなたがそこにself.current_userを移入することができます。

+0

がhelping.Butいただき、ありがとうございます私はエラーが発生します:コードを実行すると500です。 – Erina

+0

エラーログを確認する/ここでデバッグを有効にする必要がありますが、500は多くのことになります。 – deceze

+0

ああ、上記の変更は理想的には非同期でコードを動作させるはずです。そうですか? – Erina

0

はトルネード方式で「スリープ」を呼び出さないでください:

http://www.tornadoweb.org/en/stable/faq.html

あなたは、それが非ブロッキングだということを自分自身に証明from tornado import genを追加して試してしばらくするための方法を一時停止したい場合は:

async def post(self): 
    self.set_secure_cookie("user", self.get_argument("name")) 
    yield gen.sleep(10) 
    self.redirect("/") 

やPython 2:

@gen.coroutine 
def post(self): 
    self.set_secure_cookie("user", self.get_argument("name")) 
    yield gen.sleep(10) 
    self.redirect("/") 
+0

私はyield.sleepを試してみると、次のエラーが発生します:BadYieldErrorを上げてください( "未知のオブジェクト%r"%を返しました) tornado.gen.BadYieldError:未知のオブジェクト エラー:tornado.access:500 POST/login(:: 1)8.00ms – Erina

+0

yieldを待つように変更したときのコードが機能しました。 – Erina

+0

このコードを非同期にする方法はありますか? funcを変更します。 '@return_future'を使用すると、 def future_func(arg1、arg2、callback): #コールバック(結果) コールバック(結果)@genエンジン def caller(コールバック): yield future_func(arg1、arg2) callback() – Erina

関連する問題