Не удается активировать генератор в обмен на цикл

#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. Спасибо, Эрик, я сделал больше отладки и понял, что математика была слишком мала, чтобы увидеть, как движется панель прогов! Боже. Мои извинения; Я прибегнул к вычислению на основе целых чисел для цикла, который отлично работает. Спасибо, что взвесил и подтолкнул меня. Хорошего дня!