Могу ли я проверить XMLHttpRequest () в SDK с локальным хостом? - PullRequest
1 голос
/ 14 ноября 2011

Следующий код не работает, потому что когда я пытаюсь получить «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 && xhr.status == 200){ 
      console.log("request 200-OK");
    }
    else {
      console.log("connection error");
    }
  };
  xhr.send(formData);

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

ОБНОВЛЕНИЕ

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

В обработчике /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 && 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 Ответ

1 голос
/ 14 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...