0

私は AJAX で何もしたことがなく、javascript で基本的なことだけを行いました。私の Python の経験は、より科学的な側面にあります。とは言うものの、Google App Engine での私の Web サイト開発は、ajax 機能のデモを作成しようとするまでは順調に進んでいました。

GAE サイトでこのデモを見つけましたが、動作していないようです。私が経験しているハードルを説明したいので、この投稿はおそらくかなり長くなるでしょう。このデモを修正する方法または別の ajax アプローチを使用する方法について、提供できるヘルプまたは洞察を大歓迎します。

参考までに、Python 2.7 で Google App Engine を使用しており、32 ビットの Ubuntu 12.04 を実行しています。また、このトピックに関して他の質問が寄せられていることは承知していますが、満足のいく回答は見つかりませんでした。

...

そのため、デモから始めて、必要な、、およびファイルを というディレクトリにコピーindex.htmlmain.pyましapp.yamlget。指示に従って、サブディレクトリ も作成しstatic、そこに のコピーを置きましたjson2.js(デモでは、json.orgで見つけることができると言っていましたが、 githubでしか見つけることができませんでした)。したがって、私のプロジェクト構造は次のようになります。

-dir:get
  -app.yaml
  -main.py
  -index.html
  -dir static:
    -json2.js

すべてのセットアップが完了したら、Web サーバーを起動します。

chris@thinkpad:~/code/get$ python ~/google_appengine/dev_appserver.py ./

これで無事起動。ただし、ブラウザをポイントするとhttp://localhost:8080/、インポート エラーが発生します。

File "/home/chris/code/get/main.py", line 6, in <module>
from django.utils import simplejson
ImportError: No module named django.utils

少し掘り下げてみると、チュートリアルは python 2.5 用に書かれているように見えるので、app.yamlファイルにいくつかの変更を加える必要があります。デモのバージョンは次のようになります。

application: get
version: 1
runtime: python
api_version: 1

handlers:
- url: /static
  static_dir: static

- url: /.*
  script: main.py

私の新しい 2.7 バージョンを以下に示します。の追加、へthreadsafe: trueの変換、パラメータの追加に注意してください。main.pymain.applibraries

application: get
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /static
  static_dir: static

- url: /.*
  script: main.app

libraries:
- name: django
  version: latest

繰り返しますが、appserver の起動に成功しました。ここで、 を指すとhttp://localhost:8080/、次のエラーが発生します。

ImportError: <module 'main' from '/home/chris/code/get/main.pyc'> has no attribute app

これによりapp、 の下部にある関数を見ることができますmain.py。デフォルトでは、次のようになります。

def main():
    app = webapp.WSGIApplication([
        ('/', MainPage),
        ('/rpc', RPCHandler),
        ], debug=True)
    util.run_wsgi_app(app)

if __name__ == '__main__':
    main()

それをマッサージして、もう少しpython27フレンドリーにすることで、そのコードブロック全体、関数、およびすべてを次のように置き換えます。

app = webapp.WSGIApplication([
        ('/', MainPage),
        ('/rpc', RPCHandler),
        ], debug=True)

appserver を再起動し、再び を指すとhttp://localhost:8080/、最終的にページが表示されます。

ここに画像の説明を入力

残念ながら、物語は続きます。アプリサーバーを再起動して、次の出力を取得します。

chris@thinkpad:~/code/get$ python ~/google_appengine/dev_appserver.py ./
INFO     2013-05-25 16:18:28,097 sdk_update_checker.py:244] Checking for updates to the SDK.
INFO     2013-05-25 16:18:28,322 sdk_update_checker.py:272] The SDK is up to date.
INFO     2013-05-25 16:18:28,354 api_server.py:153] Starting API server at:  http://localhost:56101
INFO     2013-05-25 16:18:28,375 dispatcher.py:164] Starting server "default" running at: http://localhost:8080
INFO     2013-05-25 16:18:28,385 admin_server.py:117] Starting admin server at: http://localhost:8000

次に、[追加] ボタンをクリックします。これにより、エラーが発生します。以下にその全体を印刷しましたが、よくわかりません。

INFO     2013-05-25 16:18:37,633 server.py:585] default: "GET / HTTP/1.1" 200 3597
INFO     2013-05-25 16:18:37,989 server.py:585] default: "GET /static/json2.js HTTP/1.1" 304 -
INFO     2013-05-25 16:18:38,164 server.py:585] default: "GET /favicon.ico HTTP/1.1" 404 154
ERROR    2013-05-25 16:18:41,469 webapp2.py:1528] __init__() takes exactly 1 argument (3 given)
Traceback (most recent call last):
  File "/home/chris/google_appengine/lib/webapp2-2.3/webapp2.py", line 1511, in __call__
    rv = self.handle_exception(request, response, e)
  File "/home/chris/google_appengine/lib/webapp2-2.3/webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "/home/chris/google_appengine/lib/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/home/chris/google_appengine/lib/webapp2-2.3/webapp2.py", line 1076, in __call__
handler = self.handler(request, response)
TypeError: __init__() takes exactly 1 argument (3 given)
ERROR    2013-05-25 16:18:41,471 wsgi.py:235] 
Traceback (most recent call last):
  File "/home/chris/google_appengine/google/appengine/runtime/wsgi.py", line 223, in Handle
    result = handler(dict(self._environ), self._StartResponse)
  File "/home/chris/google_appengine/lib/webapp2-2.3/webapp2.py", line 1519, in __call__
    response = self._internal_error(e)
  File "/home/chris/google_appengine/lib/webapp2-2.3/webapp2.py", line 1511, in __call__
    rv = self.handle_exception(request, response, e)
  File "/home/chris/google_appengine/lib/webapp2-2.3/webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "/home/chris/google_appengine/lib/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/home/chris/google_appengine/lib/webapp2-2.3/webapp2.py", line 1076, in __call__
handler = self.handler(request, response)
TypeError: __init__() takes exactly 1 argument (3 given)
INFO     2013-05-25 16:18:41,479 server.py:585] default: "GET /rpc?action=Add&arg0=%221%22&arg1=%222%22&time=1369498721460 HTTP/1.1" 500 -

この時点で私は立ち往生しています。このデモを適切に機能させる方法、またはおそらく私の Web アプリを ajaxy にするためのより良い方法についての考えは、大歓迎です。

4

1 に答える 1

2

このデモを適切に機能させる方法、またはおそらく私の Web アプリを ajaxy にするためのより良い方法についての考えは、大歓迎です。

ここに完全なアプリを投稿するのは少しやり過ぎになるので、非常に単純な ajax デモを Github に投稿することにしました。これで問題がすぐに解決されるわけではありませんが、コンセプトには役立つはずです。

于 2013-05-26T02:03:01.770 に答える