2013-04-05 4 views
0

Я работаю над созданием веб-сайта вместе с GAE и каналом api для отображения и обработки данных в реальном времени от робота, над которым я работаю. Я довольно новичок в веб-разработке и python в целом, но мне кажется, что этот код должен работать. Я сделаю его более причудливым, как только я получу его работу (запись данных в базу данных, фактическую обработку данных и т. Д.), но сейчас я просто хочу, чтобы он отображал самую последнюю информацию о переменной «val» из почтового запроса, отправленного с подключенной к Интернету платы на роботе. Надеемся, это будет полезно для всех, кто хочет отображать данные в реальном времени с помощью канала api.Что случилось с кодом моего канала api?

Сейчас я показываю шаблон с полем ввода, установленным для отправки запроса на отправку на страницу. Вместо того, чтобы обновлять первую страницу с текущим значением при представлении, я получаю пустой экран. Я не уверен, действительно ли моя проблема связана с кодом api канала или функцией java для обновления отображаемого значения.

код Python:

import os 
import webapp2 
import jinja2 
import json 
import logging 
from google.appengine.ext import db 
from google.appengine.api import channel 
from google.appengine.api import users 

template_dir = os.path.join(os.path.dirname(__file__), 'templates') 
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir), autoescape=True) 

channels = [] 

class MainPage(webapp2.RequestHandler): 

    def get(self): 

     user = users.get_current_user() 
     if not user: 
      self.redirect(users.create_login_url(self.request.uri)) 
      return 

     nickname = user.nickname() 
     clientid = user.user_id() 
     channel_token = channel.create_channel(clientid) 
     channels.append(channel_token) 

     template_values = {'channel_id': channel_token, 'nickname': nickname} 

     template = jinja_env.get_template('front.html') 
     self.response.out.write(template.render(template_values)) 

    def post(self): 
     value = self.request.get("value") 

     if value: 
     jsn = json.dumps({"val": value}) 
     for i in range(len(channels)): 
      channel.send_message(channels[i], jsn) 

app = webapp2.WSGIApplication([ 
    ('/', MainPage) 
], debug=True) 

Соответствующая часть шаблона HTML:

<form method="post"> 
     <label> 
      <div>Title</div> <input type="text" name="value" value="{{value}}"> 
     </label> 
     <br> 
     <input type="submit"> 

     <div class="error">{{error}}</div> 
    </form> 

    <hr> 

    <script> 
     onMessage = function myFunction(message) 
     { 
     document.getElementById("val").innerHTML=message; 
     } 
     var token = '{{ channel_id }}'; 
     var channel = new goog.appengine.Channel(token); 
     var socket = channel.open(); 
     socket.onmessage = onMessage(message.val); 

    </script> 

    <p id="val">No value to display</p> 

</body> 

Спасибо заранее.

ответ

0

На линии в JavaScript, где вы назначаете socket.onmessage:

socket.onmessage = onMessage(message.val); 

Что вы делаете, назначая результат вызова функции OnMessage(). Вместо того, чтобы просто присвоить функцию себя socket.onmessage, например, так:

socket.onmessage = onMessage; 

Также в обработчике OnMessage, используйте message.data, чтобы получить значение в формате JSON, который вы передаёте в Чтобы получить val поля вам нужно JSON декодирования. message.data.

 Смежные вопросы

  • Нет связанных вопросов^_^