#python #generator #exchangelib
Вопрос:
Я не могу добиться успеха в том, чтобы генератор на стороне сервера уступал javascript на стороне клиента при циклическом просмотре элементов exchangelib. Я хожу по кругу. Индикатор выполнения не выходит за пределы начальных 9%, заданных переменной bar_min ниже. Я могу только предположить, что это что-то особенное для цикла обмена… Был бы признателен за некоторый экспертный вклад в мои любительские усилия, с благодарностью. Вот фрагмент кода на стороне сервера из сценария flask:
@flask_app.route('/demo/process_ews', methods=['GET', 'POST'])
def pulsemail_EWS():
__OUTLOOK_EMAIL__ = session.get('__OUTLOOK_EMAIL__')
__OUTLOOK_PASSWORD__ = session.get('__OUTLOOK_PASSWORD__')
__DBUSER__ = session.get('__DBUSER__')
def generate():
subject_actual = ""
bar_min = 9
bar_max = 100
increments = (bar_max - bar_min) / config.__EMAILCOUNT__
increments = int(round(increments))
yield "data:" str(bar_min) "nn"
full_path = config.__USER_DB_PATH__ __DBUSER__ "_pulsemail"
full_path = full_path.replace("'","")
__LAST_ANALYSYS__ = setDate()
account = connect_to_EWS(__OUTLOOK_EMAIL__, __OUTLOOK_PASSWORD__, __OUTLOOK_EMAIL__)
for item in account.inbox.filter(datetime_received__gt=__LAST_ANALYSYS__ timedelta(0,1)).only('subject','text_body','datetime_received','sender','cc_recipients'):
yield "data:" str(bar_min) "nn"
bar_min = increments
time.sleep(0.5)
return flask_app.response_class(generate(), mimetype='text/event-stream')
а вот и клиентская сторона JS:
<script>
var source = new EventSource("/demo/process_ews");
source.onmessage = function(event) {
$('.progress-bar').css('width', event.data '%').attr('aria-valuenow', event.data);
$('.progress-bar-label').text(event.data '%');
if(event.data == 100){
source.close()
var begin = document.getElementById('begin');
begin.textContent = 'Inbox Email Retrieval Complete';
location.replace("/demo/ews_output_sent")
}
}
function stop() {
source.close(); // this stops the feed
location.replace("/demo/ews_output_sent")
};
</script>
Комментарии:
1. Сначала попробуйте уменьшить проблему. Например, вы можете заменить
for item in account.inbox.filter(...)
наwhile True:
, чтобы узнать, является ли ваш код exchangelib частью проблемы.2. Спасибо, Эрик, я действительно попробовал что-то подобное со следующим фрагментом, который вел себя так, как ожидалось:
while x <= 100: yield "data:" str(x) "nn" x = x 10 time.sleep(0.5)
3. ОК. Затем вы можете удалить весь код JavaScript и сосредоточиться на том, почему ваш запрос exchangelib не возвращает никаких элементов.
4. Спасибо, Эрик, я сделал больше отладки и понял, что математика была слишком мала, чтобы увидеть, как движется панель прогов! Боже. Мои извинения; Я прибегнул к вычислению на основе целых чисел для цикла, который отлично работает. Спасибо, что взвесил и подтолкнул меня. Хорошего дня!