0

これにはすでに何時間ものグーグル検索が費やされており、まだ機能させることができません.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ディレクトリの名前を変更し、内部参照が を指すように編集しました。staticstatic/Client.htmlstatic

<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 も動作しません。)

4

1 に答える 1

1

私はあなたがおそらくこれを超えていることを知っていますが、あなたのコードを見つけることは私の修正に役立ちました。

あなたの問題はクライアントスクリプト側にあり、クライアントを起動するためにいくつかのコードを追加する必要がありました:

if __name__ == '__main__':
    app = Client()
    app.onModuleLoad()

さらに、表示されるエラーを回避するには、インポートの最初の行を次のように変更する必要があります。

from pyjamas.ui.RootPanel import RootPanel
from pyjamas.ui.TextArea import TextArea
from pyjamas.ui.Label import Label
from pyjamas.ui.Button import Button
from pyjamas.ui.HTML import HTML
from pyjamas.ui.VerticalPanel import VerticalPanel
from pyjamas.ui.HorizontalPanel import HorizontalPanel
from pyjamas.ui.ListBox import ListBox
于 2013-06-18T22:37:24.860 に答える