龙卷风 - 我应该怎么做才能执行RequestHandler.write,然后在书面内容保持可见的情况下睡一会儿?

时间:2013-04-26 04:28:41

标签: web tornado

    try:
        username = self.get_argument('username')
    except:
        self.write('Username empty')
        time.sleep(1)
        self.redirect('/auth/login')

我希望Username empty在一秒钟内可见,然后重定向。但在重定向之前,页面上似乎没有任何内容。我知道这是因为在连接关闭之前不会向客户端显示任何内容。那么无论如何要显示一秒钟的书面内容?

1 个答案:

答案 0 :(得分:3)

当您使用self.redirect时,会发送一个标头,这会导致浏览器立即重定向到/ auth / login。这是HTTP重定向的工作方式,与Tornado无关。

如果您希望页面保持可见状态,则可以使用meta refresh提供一个页面,并延迟代替self.write('Username empty')

<meta http-equiv="refresh" content="5;URL='http://example.com/auth/login'">

但元刷新也不是很理想 - W3C长期以来不鼓励使用它。在这种情况下我会做的是立即重定向并在登录页面上显示错误。例如:

self.redirect('/auth/login?error=%s' % tornado.escape.url_escape('Username empty'))

然后在登录页面上显示错误参数(如果已设置)。所以,在处理程序中:

...
error = self.get_argument('error', None)
if error is not None:
    error = tornado.escape.url_unescape(error)
....
self.render('foo.html', error=error)

在模板中:

{% if error %}
{{ error }}
{% end %}