【问题标题】:What's wrong with my channel api code?我的频道 api 代码有什么问题?
【发布时间】:2013-04-05 03:38:13
【问题描述】:

我一直致力于与 GAE 和频道 api 一起建立一个网站,以显示和处理来自我正在研究的机器人的实时数据。我对 Web 开发和一般的 python 还很陌生,但在我看来,这段代码应该可以工作,一旦我开始工作(将数据记录到数据库、实际数据处理等),我会让它变得更漂亮,但现在我只希望它显示从机器人上的互联网连接板发送的发布请求中变量“val”的最新出现。希望这对任何希望使用通道 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>

提前致谢。

【问题讨论】:

    标签: python google-app-engine channel-api


    【解决方案1】:

    在你指定socket.onmessage的javascript行上:

        socket.onmessage = onMessage(message.val);
    

    您正在做的是将调用的结果分配给 onMessage() 函数。相反,只需将函数本身分配给 socket.onmessage,如下所示:

        socket.onmessage = onMessage;
    

    同样在您的 onMessage 处理程序中,使用 message.data 获取您传入的 JSON 值。要获取 val 字段,您需要对 message.data 进行 JSON 解码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多