Найти - Пользователи
Полная версия: Задержка вывода в bottle
Начало » Web » Задержка вывода в bottle
1
bal
Задача простейшая! Делаю на bottle отчеты из Oracle. Результаты посылаю в XLS. Все работает. Вот только при тяжелых запросах браузер повисает(ожидание). Хочется вывести “Ждите…”, а там пусть крутится хоть сутки.
Оказалось не так просто. Посмотрел https://bottlepy.org/docs/dev/async.html. Использовал gevent-сервер.

@route('/stream')
def stream():
yield ‘START’
sleep(3)
yield ‘MIDDLE’
sleep(5)
yield ‘END’

Пример работает, хотя тоже не совсем адекватно. Так между
START и MIDDLE задержки нет. Подставляю вместо sleep(3) свой запрос, повисает, затем выводит сразу ВСЁ!
Как сначала вывести “Ждите…”, а затем повесить сервер?!
Спасибо!

4kpt_V
Так никто не делает.
Это тяжелые запросы и они должны выполнятся как отдельный процесс.
Рекомендую глянуть в сторону RQ.
Со стороны клиента желательно приделать какой-то механизм, который бы спрашивал через Х секунд состояние задания.
bal
>Рекомендую глянуть в сторону RQ.

Спасибо! Вот только еще бы подсказали, что такое RQ.

>Со стороны клиента желательно приделать какой-то механизм, который бы спрашивал через Х секунд >состояние задания.

Ну, по-простому, конечно, можно было все организовать через файл-семафор. Хотелось все решить средствами сервера.
bal
>Рекомендую глянуть в сторону RQ.

Спасибо! Вот только еще бы подсказали, что такое RQ.

>Со стороны клиента желательно приделать какой-то механизм, который бы спрашивал через Х секунд >состояние задания.

Ну, по-простому, конечно, можно было все организовать через файл-семафор. Хотелось все решить средствами сервера.
4kpt_V
RQ
bal
Спасибо! Смотрю, интересно
bal
Вычитал на https://khashtamov.com/ru/python-rq-howto/
Под Windows RQ работать не будет, так как полагается на механизм fork для порождения процессов, выполняющих задачи. Если вы используете Windows, то можно воспользоваться Vagrant для выполнения кода на виртуальной машине под управлением, например, Ubuntu 16.04 LTS…
А у меня как раз на винде все крутится

bal
Думаю, рыть в другом направлении
‘eventlet’: EventletServer,
Пробую…
4kpt_V
Костыль. Но дело Ваше. Вообще сервер с винды таки придется выносить…
bal
Задачку решил
Использовал просто javascript.
На кнопку повесил событие:
<input type=“submit” name=“doit” value=“Выполнить” onclick=“DOIT_Report()”>
И сама функция:
<SCRIPT LANGUAGE=“JavaScript” TYPE=“text/javascript”>
function DOIT_Report() {

var xhr = new XMLHttpRequest();

xhr.open('GET', ‘/doit_oracle_sql/{{subj}}’, true);
xhr.send();
document.body.innerHTML += // Доролняем содержимое BODY!
‘<h2>Ждите…</h2><img src=“./static/ajax-loader.gif”><img src=“./static/morda.gif”><img src=“./static/yes.gif”>’

xhr.onreadystatechange = function() {
if (xhr.readyState != 4) return;

button.innerHTML = ‘Готово!’;

if (xhr.status != 200) {
// обработать ошибку
alert(xhr.status + ‘: ’ + xhr.statusText);
} else {
// вывести результат
document.body.innerHTML = // Заменяем содержимое BODY!
xhr.responseText;
}
}
button.innerHTML = ‘Ждите…’;
button.disabled = true;
}
</SCRIPT>

Удачи всем!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB