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

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

4

1 回答 1

3

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

如果您希望页面保持可见,您可以使用元刷新来提供页面,并延迟代替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 %}
于 2013-04-26T05:03:35.773 回答