Как получить переменную count из обработчика python в функцию javascript? - PullRequest
1 голос
/ 14 ноября 2011

Я пытаюсь выдать имя пользователя каждому новому пользователю в форме user1, user2, user3 и т. Д.

В результате моего предыдущего вопроса , теперь я понимаю, что мне нужно отслеживать количество в приложении, а не в браузере. Поэтому я создал /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;  
};

Как мне получить "счет" от /counthandler до writeToStorage? Я понимаю, что мне нужно использовать HMLHttpRequest, но не знаю, как это сделать. Спасибо.

UPDATE

В ответ на комментарий 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:

Спасибо за подробное объяснение. Теперь я понимаю. Но есть еще кое-что, чего мне не хватает. Получить значение количества легко:

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

Теперь вы говорите, что присвойте значение переменной Python "count", равное 12, переменной js "count" с помощью

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

Что я не понимаю, так это то, что произойдет в следующий раз, когда счет = 13?

Мне кажется, что

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

не будет работать. Правильный? Чего мне не хватает?

Еще раз спасибо.


Обновление, чтобы попробовать второй вариант в ответе jfriend00. Похоже, мне нужно включить функцию успеха, чтобы получить переменную "count", отправляемую /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 ]

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

Я должен сказать, что вы идете по этому совершенно неправильному пути и таким образом делаете вещи намного сложнее для себя, чем они должны быть.

Надлежащее место для хранения таких вещей, как имена пользователей, не находится в локальном Javascriptхранение, но в печенье.AJAX не требуется, только код на стороне сервера.

Вы не говорите, какой серверный фреймворк вы используете, но предполагая, что это Django, вы просто сделаете response.set_cookie('username', username) - хотя, если вы используете DjangoЯ не могу представить, почему вы не используете встроенную среду аутентификации.

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

Если вы отслеживаете переменную на стороне сервера и хотите разместить ее на своей веб-странице, то вы просто выводите переменную javascript на веб-страницу со значением count. Таким образом, если ваш сервер имеет счет 12, вы просто выводите его на веб-страницу из приложения веб-сервера:

var count = 12;

Любой код JavaScript на стороне клиента может иметь доступ к значению этой переменной count. Если вы хотите изменить переменную count на веб-странице на стороне клиента, вам нужно будет выполнить запрос к серверу, чтобы изменить его на сервере (Post или Get), как правило, с помощью сообщения формы или вызова ajax.


Есть два способа решения этой проблемы:

Вариант 1:

Вы сказали, что у вас есть значение count на вашем сервере. Он хранится где-то на вашем сервере. Это не в / counthandler или / choice - это просто скрипты, которые запускаются на вашем сервере. Таким образом, если вы хотите получить значение счетчика на веб-странице / choice, измените сценарий Python / choice и получите значение счетчика в этом сценарии, а затем вставьте его в веб-страницу так же, как и все остальное на веб-странице из сценария Python (как именно вы это делаете, зависит от того, какую среду Python вы используете), но если вы уже создаете веб-страницы из сценариев Python, вы уже должны это делать. Затем в соответствующем месте на этой веб-странице вы помещаете этот фрагмент JavaScript:

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

Вы НЕ получаете значение из / counthandler и помещаете его в / count с сервера. В скрипте / count вы извлекаете значение count и помещаете его на эту веб-страницу.

Option2:

На веб-странице / choice вы делаете ajax-запрос к какой-либо серверной странице (возможно, / counthandler), чтобы получить текущий счетчик. Обработчик успеха от этого вызова ajax будет иметь желаемое значение подсчета, и вы сможете затем использовать его на веб-странице.

Что касается записи его в localalstorage, мы до сих пор не знаем, почему вы пытаетесь сделать это вечером, так как вы, похоже, уже храните его на сервере. localstorage - это специфичное для браузера хранилище, которое работает только в этом конкретном браузере и может быть очищено пользователем в любое время.

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