これにはすでに何時間ものグーグル検索が費やされており、まだ機能させることができません.SOに助けを求める時間です:-)
フロントエンドが Pyjamas で記述され、バックエンドがWeb.pyで実行される簡単なテスト アプリケーションをまとめようとしました。JSON-RPC を介して相互に通信することになっています。必要な機能は、ユーザーが文字列を入力してから大文字に変換できるようにすることです。
パジャマのオンライン ブック"Rest of the World"には、 JSON-RPC の使用方法に関する説明があります。JSON-RPC は、さまざまなテクノロジが混在しているため、解析が困難です。Amund Tveit のブログなどからのヒントを見て、次のようにまとめました。
1)非常に単純なサーバー スクリプト:
import web
import json
import os
urls = (
'/json', 'JSONHandler',
'/json/', 'JSONHandler',
)
app = web.application(urls, globals())
class JSONHandler:
def json_upper(self,args):
return [args[0].upper()]
def json_markdown(self,args):
return [args[0].lower()]
def POST(self):
args = json.loads(web.data())
print args
json_func = getattr(self, 'json_%s' % args[u"method"])
json_params = args[u"params"]
json_method_id = args[u"id"]
result = json_func(json_params)
# reuse args to send result back
args.pop(u"method")
args["result"] = result[0]
args["error"] = None # IMPORTANT!!
web.header("Content-Type","text/html; charset=utf-8")
return json.dumps(args)
if __name__ == "__main__":
app.run()
Josh Marshall の JSON-RPC ライブラリに依存する単純なクエリ スクリプト (表示されていません) でテストされ、確実に動作します。
2)パジャマ用のクライアント スクリプトも簡単です。
# Client example from Amund Tveit's blog
# http://amundblog.blogspot.co.at/2008/12/ajax-with-python-combining-pyjs-and.html
# note: ui and JSONService were not prefixed with pyjamas, but that's needed
from pyjamas.ui import RootPanel, TextArea, Label, Button, HTML, VerticalPanel, HorizontalPanel, ListBox
from pyjamas.JSONService import JSONProxy
class Client:
def onModuleLoad(self):
self.TEXT_WAITING = "Waiting for response..."
self.TEXT_ERROR = "Server Error"
# This is the remote service
self.remote_server = UpperService()
self.status=Label()
self.text_area = TextArea()
self.text_area.setText(r"Please uppercase this string")
self.text_area.setCharacterWidth(80)
self.text_area.setVisibleLines(8)
self.button_py = Button("Send to Python Service", self)
buttons = HorizontalPanel()
buttons.add(self.button_py)
buttons.setSpacing(8)
info = r'Upper-case a string using JSON-RPC'
panel = VerticalPanel()
panel.add(HTML(info))
panel.add(self.text_area)
panel.add(buttons)
panel.add(self.status)
RootPanel().add(panel)
def onClick(self, sender):
self.status.setText(self.TEXT_WAITING)
text = self.text_area.getText()
# (data, response_class): if the latter is 'self', then
# the response is handled by the self.onRemoteResponse() method
if self.remote_server.upper(self.text_area.getText(), self) < 0:
self.status.setText(self.TEXT_ERROR)
def onRemoteResponse(self, response, request_info):
self.status.setText(response)
def onRemoteError(self, code, message, request_info):
self.status.setText("Server Error or Invalid Response: ERROR " + code + " - " + message)
# AJAX calls must come from the same server, only the path is given here
class UpperService(JSONProxy):
def __init__(self):
JSONProxy.__init__(self, "/json/", ["upper"])
PyJs でコンパイルし、web.py が提供できるようにデフォルトoutput
ディレクトリの名前を変更し、内部参照が を指すように編集しました。static
static/Client.html
static
<html>
<!-- auto-generated html - You should consider editing and adapting this
to suit your requirements. No doctype used here to force quirks mode; see
wiki for details: http://pyjs.org/wiki/csshellandhowtodealwithit/
-->
<head>
<title>Client (Pyjamas Auto-Generated HTML file)</title>
<meta name="pygwt:module" content="/static/Client"> <!-- was content="Client" -->
</head>
<body style="background-color:white">
<script type="text/javascript" src="/static/bootstrap.js"></script> <!-- was src="bootstrap.js" -->
<iframe id="__pygwt_historyFrame" style="display:none;"></iframe>
</body>
</html>
...そして、ブラウザを に向けhttp://localhost:8080/static/Client.html
ます。私が得たのは空白のページだけで、static/Client.html
上記のページソースを調べたので、実際にブラウザに提供されました. サーバーのログには、少なくともいくつかのページが提供されたことが示されています。
http://0.0.0.0:8080/
127.0.0.1:61466 - - [14/Mar/2013 13:59:39] "HTTP/1.1 GET /static/Client.html" - 200
127.0.0.1:61466 - - [14/Mar/2013 13:59:40] "HTTP/1.1 GET /static/Client.nocache.html" - 200
127.0.0.1:61466 - - [14/Mar/2013 13:59:40] "HTTP/1.1 GET /static/Client.safari.cache.html" - 200
ただし、何が問題なのかは示されていません。デバッグスタックトレースを取得することを期待して、ディレクトリの名前を変更し、パジャマ部分を -d オプションでコンパイルして、あらゆる種類の他の URL の組み合わせを試しましたが、役に立ちませんでした。
Pajamas と Web.py を連携させることに成功した人はいますか? はいの場合は、その方法を共有してください。ありがとう。
PS: web.py V0.37 と最新の Pajamas 開発リリースを使用しています。(現在の安定版リリース V0.8.1 も動作しません。)