#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, а также обычным способом с помощью формы. Вам придется изменить две вещи.
writeToStorage
должно вернутьсяfalse
в качестве последнего действия- Измените свой
onsubmit
наonsubmit="return writeToStorage()"
Таким образом, вы предотвратите отправку вашей формы по умолчанию, поскольку это будет сделано через AJAX в writeToStorage