Javascript 我可以用localhost在SDK中测试XMLHttpRequest()吗?

Javascript 我可以用localhost在SDK中测试XMLHttpRequest()吗?,javascript,python,google-app-engine,xmlhttprequest,Javascript,Python,Google App Engine,Xmlhttprequest,以下代码似乎不起作用,因为当我尝试在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.a

以下代码似乎不起作用,因为当我尝试在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呼叫或应用程序有问题吗

更新

根据Daniel Roseman的评论,我将代码包括在
/choice
中,以澄清“chooser”是什么:

/choice
处理程序中,我有
writeToStorage()
,它以
user1、user2
等形式分配用户名,并将其写入
localStorage

将用户名写入
localStorage
后,我还需要将其写入应用程序中的数据库,并使用
xhr
将其发送到
/g/choicehandler
处理程序

所以,“选择者”,我相信是一根弦,由

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>""")
这是上述日志的代码:

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”写在两个不同的行中。我做错了什么

实际上,您提交了两次表单。一旦通过AJAX进入writeToStorage,也可以使用表单的常规方式。你必须改变两件事

  • writeToStorage
    必须返回
    false
    作为最后一个操作
  • 将您的
    onsubmit
    更改为
    onsubmit=“return writeToStorage()”

  • 这样可以防止表单的默认提交,因为这将通过AJAX的writeToStorage来完成。实际上,表单提交了两次。一旦通过AJAX进入writeToStorage,也可以使用表单的常规方式。你必须改变两件事

  • writeToStorage
    必须返回
    false
    作为最后一个操作
  • 将您的
    onsubmit
    更改为
    onsubmit=“return writeToStorage()”

  • 通过这种方式,您将防止默认提交表单,因为这将通过AJAX的writeToStorage来完成。只要使用此脚本的页面也由localhost:8086提供,“chooser”应该是什么?您确定
    user
    在javascript中有值吗?你试过用字符串文字替换它进行测试吗?@DanielRoseman;我更新了问题以澄清“chooser”@NickJohnson;为了清晰起见,我在脚本中删除了几个警报,我看到一个用户值按预期写入了localStorage。我还尝试了
    localStorage.getItem(“选择器”)
    in/choicehandler,这将从localStorage获取用户名。只要使用此脚本的页面也由localhost:8086提供,“chooser”应该是什么?您确定
    user
    在javascript中有值吗?你试过用字符串文字替换它进行测试吗?@DanielRoseman;我更新了问题以澄清“chooser”@NickJohnson;为了清晰起见,我在脚本中删除了几个警报,我看到一个用户值按预期写入了localStorage。我还尝试了
    localStorage.getItem(“选择器”)
    in/choicehandler,这将从localStorage获取用户名。
    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()