我的频道 API 代码有什么问题?



我一直致力于与GAE和通道api一起获得一个网站,以显示和处理来自我正在研究的机器人的实时数据。我对web开发很陌生,一般来说,python,但在我看来,这段代码应该工作,我会让它更花哨,一旦我得到它的工作(记录数据到数据库,实际的数据处理等),但现在我只是想让它显示最近发生的变量"val"从互联网连接板上的机器人发送的post请求。希望这将有助于任何人希望做实时数据显示与通道api。

现在我正在显示一个模板,其中设置了一个输入框,用于向页面发送post请求。然而,在提交时,我没有使用当前值更新首页,而是得到一个空白屏幕。我不确定我的问题是否与通道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>

在javascript中指定socket.onmessage:

    socket.onmessage = onMessage(message.val);

你正在做的是将调用的结果分配给onMessage()函数。只需将函数本身赋值给socket即可。Onmessage,像这样:

    socket.onmessage = onMessage;

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

最新更新