2016-12-01 9 views
-1

У меня есть два запроса ajax, который отправляет данные на сервер (назовем его Ajax # 1), а затем тот, который использует эти отправленные данные для загрузки материала на передний план end (Ajax # 2).Запрос ajax дает 500 ошибок при вызове из другого запроса ajax

Чтобы убедиться, что Ajax # 2 работает после Ajax # 1, я попытался передать функцию, содержащую # 2, в качестве обратного вызова функции, содержащей # 1, где он вызывается после завершения # 1.

Однако это всегда приводит к ошибке 500.

Ajax # 2 отлично работает на своем собственном (когда он срабатывает при нажатии кнопки), но при вызове из Ajax # 1 он всегда дает ошибку 500.

Любая идея, что я делаю неправильно здесь?

var initialize = function(){ 

    //Load settings config on page load (this works fine) 
    load_settings_config(); 

    //Should apply settings on button press, and load those new settings to front end 
    $("#apply-sysconfig-button").click(function(){ 
    apply_settings_config(load_settings_config); 
    }); 

    //manual load settings button (This works fine) 
    $("#load-settings-button").click(function(){ 
    load_settings_config(); 
    }); 

}; 

apply_settings_config = function(callback){ 

    //Not shown - Grabs user input from html input and select elements and loads into the variable 'settings' to be sent to back end 
    //Ajax#1 
    $.ajax({ 
     method: "POST", 
     contentType: 'application/json', 
     url: "/applynewsettings", 
     data: JSON.stringify(settings) 
    }) 
    .done(function(sysconfig_err_msg){ 
    //prompt user with error message if user input is invalid 
    $("#static-ip-input-err").html(sysconfig_err_msg); 

    //This does not work - gives 500 error 
    callback() 
    }); 
}; 

load_settings_config = function(){ 
    //loads the new/updated settings back to front end 
    //Ajax#2 
    $.ajax({ 
    method: "GET", 
    contentType: 'application/json', 
    url: "/loadinterfaceinfo" 
    }) 
    .done(function(interface_info_new){ 
     interface_info = JSON.parse(interface_info_new); 
     interface_selected = $("#interface-dropdown option:selected").text() 
     populate_interface_info(interface_selected); 

    }); 
}; 

Обратите внимание, что я также попытался

$("#apply-sysconfig-button").click(function(){ 
    apply_settings_config(); 
    load_settings_config(); 
    }); 

Что удивительно вызывает нагрузку часто работать, прежде чем применить отделку.

И я пытался вызвать функцию непосредственно из AJAX, как это:

apply_settings_config = function(){ 

    //Not shown - Grabs user input from html input and select elements and loads into the variable 'settings' to be sent to back end 
    //Ajax#1 
    $.ajax({ 
     method: "POST", 
     contentType: 'application/json', 
     url: "/applynewsettings", 
     data: JSON.stringify(settings) 
    }) 
    .done(function(sysconfig_err_msg){ 
    //prompt user with error message if user input is invalid 
    $("#static-ip-input-err").html(sysconfig_err_msg); 

    //This does not work - gives 500 error 
    load_settings_config() 
    }); 
}; 

Что дает такую ​​же ошибку 500.

Кажется, мне не хватает части того, как выполнять обратные вызовы с асинхронными запросами на получение/отправку. Любая помощь будет высоко ценится


EDIT Было предложено, чтобы увидеть бэкенд. Я не уверен, как это поможет в том, что в большинстве случаев оба запроса работают нормально. Только тогда, когда Аякс запросы вложенные, что внешний не работает, но здесь они все равно:

@app.route("/applynewsettings", methods=['POST']) 
def apply_new_settings(): 
    global sys_settings 
    sia_err_msg = "" 

    if request.method == 'POST': 
     sys_settings = request.json 

    sys_settings = convertToASCII(sys_settings) 

    mtu = sys_settings["mtu"] 
    ip_address = sys_settings["ip_address"] 
    subnet_mask = sys_settings["subnet_mask"] 
    gateway = sys_settings["gateway"] 
    interface = sys_settings["interface"] 

    #Not shown - validation and build string to send command 

    if "sia" in sia_cmd: 
     cli.sendCmd(sia_cmd) 
     sia_err_msg = "Sucess!" 
     print "SEND CMD: "+sia_cmd 
    else: 
     print "sia cmd was invalid: "+"'"+sia_cmd+"'" 
     sia_err_msg = sia_err_msg + "Apply Settings Failed!" 

    return sia_err_msg 

#Sends cmd through telnet cli, parses response, returns to front end 
@app.route("/loadinterfaceinfo") 
def load_interface_info(): 
    #Sends cmd through telnet cli & parses response 
    interface_dict = run_cmd(cli,"get_interface_info") 
    #must encode as json to send to front end 
    interface_dict = json.JSONEncoder().encode(interface_dict) 
    #send to front end 
    return interface_dict 
+1

Возможно, вы обнаружите, что такое ошибка 500? Кроме того, не уверен, имеет ли это значение, но ваш URL '/ applynewsetttings', кажется, включает дополнительный« t » – Beno

+0

без какой-либо информации о стороне сервера, которая является источником ошибки, не может помочь значительно –

+0

вместо' data : JSON.stringify (настройки) 'try' data: settings' –

ответ

0

Источника проблема был на внутреннем интерфейсе. Каждый запрос отправлял команду с помощью telnet. Когда обе команды выполнялись в быстрой последовательности (с одним запросом ajax внутри другого), вторая команда telnet зависала бы, потому что первая еще не закончилась. Почему именно это привело к ошибке 500 (что заставило меня поверить, что второй запрос ajax вообще не связывался с бэкэнд). Я не совсем уверен.

Быстрое (и неаккуратное) исправление заключается в добавлении таймаута, чтобы второй аякс подождал секунды до запуска.

Как так:

$.ajax({ 
     method: "POST", 
     contentType: 'application/json', 
     url: "/applynewsettings", 
     data: JSON.stringify(settings) 
    }) 
    .done(function(sysconfig_err_msg){ 
    $("#static-ip-input-err").html(sysconfig_err_msg); 

    setTimeout(function(){ load_settings_config(); }, 1000); 

    }); 

Лучше (и более трудное) решение было бы, чтобы убедиться, на внутреннем интерфейсе, что он признает, что телнет используется другой команда работает, ждет, пока она не будет завершена, и затем запускает вторую команду и возвращает данные.

Не знаю, как это сделать. Идеи приветствуются.

+0

Мое недопонимание, вероятно, связано с тем, что я никогда не работал с telnet, но как/почему ваш аякс сделал обратный вызов, прежде чем запрос завершится? – Jecoms

+0

@Jecoms Первый запрос ajax отправляет данные через telnet через python (используя флягу) и не полагается на telnet, чтобы возвращать что-либо (python возвращает строку с сообщением об ошибке, если она есть, но полностью обрабатывается бэкэном python) , Поэтому, если команда, отправленная через ajax, занимает 0,5 секунды для обработки и завершения, любые другие команды, отправленные в течение этого времени, не будут работать, потому что соединение telnet занято. Второй запрос ajax фактически полагается на ответ от telnet, а не только на передачу данных на него, поэтому он ломается, когда он не может отправлять или получать что-либо. –