Почему XMLHttpRequest (), похоже, не может обновиться?

#javascript #python #flask

Вопрос:

Вот мой Html-код:

 <html>
<head>
<title>aerator</title>
</head>

<body>

<div id="train"></div>
<div id="predict"></div>

 

Вот мой Javascript. Я пытаюсь получить данные с помощью XMLHttpRequest для каждого определенного набора интервалов для 2 переменных, чтобы позже использовать каждую из них для обновления html с помощью идентификатора div и прогнозирования

 $(document).ready(function(){
refresh();
});


function refresh()
{                                                                       
    setTimeoutfunction(){
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
                if (this.readyState == 4 amp;amp; this.status == 200) {
                    document.getElementById("predict").innerHTML = this.responseText;
                }
        };
        
        xhttp.open("POST", "http://127.0.0.1:5000/predict", true);
        xhttp.send();
    }, 1100);
    
    setTimeout{function(){
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
                if (this.readyState == 4 amp;amp; this.status == 200) {
                    document.getElementById("train").innerHTML = this.responseText;
                }
        };
        
        xhttp.open("POST", "http://127.0.0.1:5000/train", true);
        xhttp.send();
    }, 3000);
}
 

Ниже приведен мой код колбы python. Я включаю необходимую функцию, на которую ссылаюсь в своем коде javascript выше.
Редактировать : На самом деле я пробовал как метод POST, так и метод GET, и оба они не извлекают данные.

 @app.route("/predict")
def mainPrediksi():
    predict = preprocessing('root','','127.0.0.1','database')

    if(condition):
        X = 'option1'
    else:
        X = 'option2'
    return (X,str(datetime.now()))

@app.route("/train")
def mainTrain():
    X_train,X_test,Y_train,Y_test = preprocessing('root','','127.0.0.1','database')

    X_train = X_train.astype(float)
    Y_train = Y_train.astype(float)

    #train classifier
    model = train_clf(X_train,Y_train)
    
    # save the model to disk
    filename = 'randomForest.sav'
    joblib.dump(model, filename)
 
    return ('Success Train Model',str(datetime.now()))

 

Я ожидаю , что мой запрос XHTTML получит возвращаемое значение от /predict and /train , но из того, что я вижу в своем терминале, кажется, что он только отправляет запрос и не получает никакого ответа. Есть ли что-нибудь, что я сделал не так? Спасибо

Комментарии:

1. Что происходит/не происходит, что заставляет вас говорить, что это не работает? Ты не описал симптом, я бы ожидать исходя из основных проблем, которую я вижу навскидку: вы используете setInterval (который планирует повторяющийся таймер), и затем вызов refresh , который начинается другой повторяющийся таймер, снова и снова, так что в относительно короткие сроки вы будете иметь тысячи интервальных таймеров все пытаетесь запустить. Для одноразового таймера используйте setTimeout . (И я бы посоветовал вам не запускать следующий таймер до тех пор, пока не будет завершен ajax-запрос, запущенный предыдущим.)

2. Привет @Ти Джей Краудер, спасибо за ответ. Я ожидаю , что мой запрос XHTTML получит возвращаемое значение от /predict and /train , но из того, что я вижу в своем терминале, кажется, что он только отправляет запрос и не получает никакого ответа. Я совсем новичок в веб-программировании и колбе, поэтому, возможно, я ошибаюсь, но из того, что я знаю, в каждом сообщении должен быть правильный ответ, но я не вижу в своем терминале только сообщение.

3. Я не могу помочь со стороной Python/Flask. Вы можете проверить вкладку Сеть в devtools браузера. Но setInterval проблема, описанная выше, нуждается в устранении. 🙂 Кроме этого, ваш XMLHttpRequest код выглядит нормально, хотя я бы всегда рекомендовал использовать fetch его вместо этого (просто остерегайтесь пистолета, о котором я пишу здесь ). Но опять же, этот код XHR в порядке.

Ответ №1:

Разве xhttp.open не является методом «POST» для отправки данных? Если вы хотите получить данные, используйте метод «ПОЛУЧИТЬ»?

Ответ №2:

Для тех, кто, возможно, захочет узнать, в чем проблема, мне на самом деле удается выяснить причину, по которой сообщение не дало никакого ответа. Это связано с тем, что в flask вам нужно указать методы доступа к функции, иначе ваш запрос на публикацию или получение будет проигнорирован.

 @app.route("/predict",methods=["POST","GET"])--> added methods in here
def mainPrediksi():
    predict = preprocessing('root','','127.0.0.1','database')

    if(condition):
        X = 'option1'
    else:
        X = 'option2'
    return (X,str(datetime.now()))
 

Спасибо за помощь сообщества, и я надеюсь, что мой ответ поможет тем, кто в нем нуждался.