Могу ли я протестировать XMLHttpRequest() в SDK с localhost?

#javascript #python #google-app-engine #xmlhttprequest

#javascript #python #google-app-engine #xmlhttprequest

Вопрос:

Следующий код, похоже, не работает, потому что, когда я пытаюсь получить «chooser» в Google App Engine (Python), он не определен:

 chooser = self.request.get("chooser")
self.response.out.write("chooser: %s " % chooser)
#returns "chooser:" without any value
  

Допустим ли этот javascript?

   var formData = new FormData();
  formData.append("chooser", user);

  var xhr = new XMLHttpRequest();
  //is it ok to test this with localhost?
  xhr.open("POST", "http://localhost:8086/g/choicehandler", true);
  xhr.onreadystatechange = function (aEvt) {
    if (xhr.readyState == 4 amp;amp; xhr.status == 200){ 
      console.log("request 200-OK");
    }
    else {
      console.log("connection error");
    }
  };
  xhr.send(formData);
  

Проблема в вызове XHR или в приложении?

Обновить

Я включаю код в /choice , чтобы уточнить, что такое «chooser» в соответствии с комментарием Дэниела Розмана:

У меня есть /choice обработчик writeToStorage() , который присваивает имя пользователя в форме user1, user2 и так далее, и записывает это в localStorage .

После ввода имени пользователя в localStorage мне также нужно записать его в базу данных в приложении, и я использую его xhr для отправки в /g/choicehandler обработчик.

Итак, «chooser», я полагаю, представляет собой строку, состоящую из

 var user = "user"   count;
  

Я копирую /choice обработчик ниже:

 class Choice(webapp.RequestHandler):
    def get(self):
        self.response.out.write("""
<html>
  <head>
<script type="text/javascript">

var count = 0;

function writeToStorage()
{ 
  var user = "user"   count;
  count  ;
  localStorage.setItem("chooser", user);

  var formData = new FormData();
  formData.append("chooser", user);

  var xhr = new XMLHttpRequest();
  xhr.open("POST", "http://localhost:8086/g/choicehandler", true);
  xhr.onreadystatechange = function (aEvt) {
    if (xhr.readyState == 4 amp;amp; xhr.status == 200){ 
      console.log("request 200-OK");
    }
    else {
      console.log("connection error");
    }
  };
  xhr.send(formData);  
};

</script>

  </head>
  <body>


<form name="choice_form" id="choice_form" action="/g/choicehandler" method="post" onsubmit="writeToStorage()">
  <textarea name="choice" rows="7" cols="50"></textarea><br />
  <input type="submit" value="submit your choice">
</form>

  </body>
</html>""")
  

ОБНОВЛЕНИЕ 2

Я заметил в журналах, что текст из textarea, который является «choice», и «chooser», который отправляется с помощью xhr, не отображаются вместе, один из них всегда без значения:

 INFO ... chooser: user0 choice: 
INFO ... chooser:  choice: abcd

INFO ... chooser: user0 choice: 
INFO ... chooser:  choice: efgh
  

Это код для приведенного выше журнала:

 chooser = self.request.get("chooser")
choice = self.request.get("choice")
logging.info("chooser: %s choice: %s" % tuple([chooser, choice]))


new_choice = User(
    choice = choice,
    owner = chooser)

new_choice.put()
  

итак, в хранилище данных я вижу «chooser» и «choice», написанные в 2 разных строках. Что я делаю не так?

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

1. Это нормально, если страница, использующая этот скрипт, также обслуживается с localhost: 8086

2. Каким должен быть «выбирающий»?

3. Вы уверены, что user в вашем javascript есть значение? Вы пробовали заменить его строковым литералом для тестирования?

4. @DanielRoseman; Я обновил вопрос, чтобы уточнить «выбирающий»

5. @NickJohnson; У меня есть несколько предупреждений в скрипте, которые я удалил для наглядности, и я вижу, что пользовательское значение записывается в localStorage, как и ожидалось. И я также попробовал localStorage.getItem("chooser"); в / choicehandler, и это возвращает имя пользователя из localStorage.

Ответ №1:

На самом деле вы отправляете форму дважды. Один раз в writeToStorage через AJAX, а также обычным способом с помощью формы. Вам придется изменить две вещи.

  1. writeToStorage должно вернуться false в качестве последнего действия
  2. Измените свой onsubmit на onsubmit="return writeToStorage()"

Таким образом, вы предотвратите отправку вашей формы по умолчанию, поскольку это будет сделано через AJAX в writeToStorage