如何从python处理程序获取计数变量到javascript函数?

时间:2011-11-14 16:20:20

标签: javascript python xmlhttprequest

我正在尝试以user1,user2,user3等形式向每个新用户发出用户名。

作为my previous question的结果,现在我明白我需要在应用中跟踪计数,而不是在浏览器中。所以我创建了/counthandler(我正在使用Google App Engine Python):

class CountHandler(webapp.RequestHandler):
    def get(self):
        count = count + 1

/choice中,我有这个脚本:

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

  document.getElementById("form_chooser").value = user;  
};

如何从/counthandlerwriteToStorage获得“统计”?我知道我需要使用HMLHttpRequest,但不知道如何使用。感谢。

更新

在回应jfriend00的评论时,我添加了更多关于ajax调用的具体问题:

  var xhr = new XMLHttpRequest();
  xhr.open("POST", "http://localhost:8086/counthandler", true);
  xhr.onreadystatechange = function (aEvt) {
    if (xhr.readyState == 4 && xhr.status == 200){ 
      console.log("request 200-OK");
    }
    else {
      console.log("connection error");
    }
  };
  //I am not sure what to put in send()?
  xhr.send();

更新2

为了回应jfriend00的评论和提供的参考,我将呼叫改为GET;但不确定在此之后会发生什么:

  var xhr = new XMLHttpRequest();
  xhr.open("GET", "http://localhost:8086/counthandler", true);
  xhr.onreadystatechange = function (aEvt) {
    if (xhr.readyState == 4 && xhr.status == 200){ 
      console.log("request 200-OK");
    }
    else {
      console.log("connection error");
    }
  };
  //changed this to "null". this now opens the connection.
  //what do I do after this?
  xhr.send(null);

更新回答jfriend00的更新回答:

感谢您的详细解释。现在我明白了。但是我仍然缺少一些东西。很容易得到count的值:

query = Count.all()
query.get()
count = e.count
logging.info("count = %s" % count)
# gives count = 12

现在你要说的是,将带有

的js变量“count”的python变量“count”的值赋值为12
<script type="text/javascript">
var count = 12;
</script>

我不明白下次当计数= 13时会发生什么?

在我看来

<script type="text/javascript">
var count = count;
</script>

不起作用。正确?我错过了什么?

再次感谢。


更新以尝试jfriend00的答案中的第二个选项。似乎我需要包含一个成功函数来获取/counthandler发送的“计数”变量:

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function()
    {
        if (xhr.readyState == 4 && xhr.status == 200)
        {
            //get "count" sent by /counthandler?
            //var count = count;
        }
    };
    xhr.open("POST", "http://localhost:8086/counthandler", true);
    xhr.send(null);

但我仍然不明白/counthandler如何发送“计数”以及如何在成功函数中获取它。

2 个答案:

答案 0 :(得分:1)

如果要跟踪变量服务器端并且想要将其放在网页中,那么只需将javascript变量输出到网页,其值为count。因此,如果您的服务器的计数为12,那么您只需从Web服务器应用程序将其输出到网页:

var count = 12;

然后,任何客户端javascript代码都可以访问该count变量的值。如果要从客户端网页修改计数变量,则必须发出服务器请求,以便在服务器上进行修改(Post或Get),通常使用表单发布或ajax调用。< / p>


有两种方法可以解决这个问题:

选项1:

您已经说过在服务器上拥有count值。它存储在你的服务器上。它不在/ counthandler或/ choice中 - 这些只是在您的服务器上运行的脚本。所以,如果你想要/ choice网页中的计数值,那么你去修改/ choice python脚本并获得该脚本中count的值,然后将其插入到网页中,就像放入其他任何内容一样在python脚本的网页中(具体如何取决于你正在使用的python环境),但如果你已经从python脚本创建网页,你必须已经这样做了。然后,在该网页的适当位置,您放置了这段javascript:

<script type="text/javascript">
var count = 12;
</script>

您没有从/ counthandler获取值并将其放入/ count从服务器。在/ count脚本中,您获取count的值并将其放入该网页。

选项2:

在/ choice网页中,您向某个服务器页面(可能是/ counthandler)发出ajax请求以获取当前计数。来自该ajax调用的成功处理程序将具有所需的计数值,然后您可以在网页中随意使用它。

至于将其写入localstorage,我们仍然不知道为什么你晚上尝试这样做,因为你似乎已经将它存储在服务器上了。 localstorage是特定于浏览器的存储,只能在该特定浏览器中使用,并且可以由用户随时清除。

答案 1 :(得分:1)

我必须说,你完全以错误的方式解决这个问题,从而使自己的事情变得比他们需要的更难。

存储用户名等内容的正确位置不在Javascript本地存储中,而是在cookie中。不需要AJAX,只需要服务器端代码。

你没有说你正在使用什么服务器端框架,但假设它是Django,你只需response.set_cookie('username', username) - 虽然如果你使用Django,我无法想象为什么你不会使用内置的身份验证框架。