2013-04-26 4 views
1
try: 
     username = self.get_argument('username') 
    except: 
     self.write('Username empty') 
     time.sleep(1) 
     self.redirect('/auth/login') 

Я хочу, чтобы Username empty отображался в течение одной секунды, а затем перенаправлялся. Но ничего не появляется на странице перед перенаправлением. Я знаю, потому что ничего не будет показано клиенту до закрытия соединения. Так или иначе, чтобы отобразить написанный контент на секунду?tornado - Что мне делать, чтобы выполнить RequestHandler.write, а затем спать на секунду, пока написанный контент остается видимым?

+0

это не связано с вашим вопросом, но вы не должны использовать time.sleep() в торнадо. Вызов его заблокирует ваш сервер для времени сна. Вместо этого введите tornado.gen.sleep() –

ответ

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 %} 

 Смежные вопросы

  • Нет связанных вопросов^_^