如何让GWT接收Python GAE Channel API创建的令牌?

时间:2012-10-01 21:59:49

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

我想在我的GWT应用程序中使用GAE Channel API(Python 2.7)(使用GWT-GAE-Channel),我无法弄清楚如何将在服务器端Python上创建的令牌放入我的GWT app(此示例中为“index.html”),以便客户端GWT可以打开该频道。我的服务器端代码目前如下所示:

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

jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))

class MainPage(webapp2.RequestHandler):
    #The main page returns the GWT application
    def get(self):

        #Create a token when the GWT app is loaded to create a channel to return data
        client_id = uuid.uuid4().hex
        token = channel.create_channel(client_id, duration_minutes=None)     

        context = {} #There are currently no template variables in the GWT app
        template = jinja_environment.get_template('index.html')
        self.response.out.write(template.render(**context))

class A_handler(webapp2.RequestHandler):
    def post(self):
        client_id = self.request.get('id')
        channel.send_message(client_id, message)



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

我有与this question相同的GWT-GAE-Channel客户端代码示例;但是,从GWT ChannelFactory.createChannel函数服务器接收“令牌”的GWT代码是什么? python服务器可以将此令牌作为模板变量发送到GET请求中的GWT html,还是需要通过RPC或其他方法发送?

1 个答案:

答案 0 :(得分:0)

感谢this threadthis tutorial以及了解javascript,我能够解决这个问题。

我使用的方法是发送令牌'作为GWT html文件的上述python服务器端代码中的模板变量:

context = {'token': token} 
template = jinja_environment.get_template('index.html')
self.response.out.write(template.render(context))

并将以下内容添加到GWT html文件中:

<script type="text/javascript">
    var token = "{{ token }}";
    </script>

在Eclipse(GWT)中,我添加了以下JSNI函数来读取javascript变量:

private native String get_token() /*-{
return $wnd.token
}-*/;

然后我在Java OnModuleLoad中包含以下函数来读取javascript变量:

String token = get_token().toString();

如果您要从javascript发送多个变量,则可以使用链接教程中所述的字典。