October 22, 2024
Chicago 12, Melborne City, USA
jQuery

AJAX polling continues indefinitely even after report generation is complete in Flask app


I have a flask application where users can generate reports. The reports are generated successfully, the report file is produced, but my polling mechanism never stops because the report status is never marked as complete, it remains always as ‘running’.

Here’s the relevant code:

ajax request and polling:

$.ajax({
    url: '/submit',
    type: 'POST',
    data: formData,
    dataType: 'json',
    success: function(response) {
        console.log(response.message);
        pollReportStatus();
    },
    error: function(xhr, status, error) {
        // Error handling code
    }
});

function pollReportStatus() {
    var intervalId = setInterval(function(){
        $.ajax({
            url: '/report-status',
            type: 'GET',
            dataType: 'json',
            success: function(response) {
                if (response.status === 'complete') {
                    clearInterval(intervalId);
                    // Logic after polling stops
                }
            },
            error: function(xhr, status, error) {
                // Error handling code
            }
        });
    }, 30000);
}

python code:

@app.route('/submit', methods=['POST'])
def submit():
    session['report_status'] = 'running'
    session.modified = True

    @copy_current_request_context
    def generate_report_session_accessible():
        generate_report(report, session['username'], session['password'])

    executor = concurrent.futures.ThreadPoolExecutor(max_workers=1)
    executor.submit(generate_report_session_accessible)

    return jsonify({"status": "success", "message": "Report successfully submitted"})

def generate_report(report, username, password):
    try:
        // Report generation logic
 
        session['report_status'] = 'complete'
        session.modified = True
    except Exception as e:
        session['report_status'] = 'error'
        session.modified = True

@app.route('/report-status', methods=['GET'])
def report_status():
    status = session.get('report_status', 'not_started')
    return jsonify({"status": status})



You need to sign in to view this answers

Leave feedback about this

  • Quality
  • Price
  • Service

PROS

+
Add Field

CONS

+
Add Field
Choose Image
Choose Video