私は AJAX で何もしたことがなく、javascript で基本的なことだけを行いました。私の Python の経験は、より科学的な側面にあります。とは言うものの、Google App Engine での私の Web サイト開発は、ajax 機能のデモを作成しようとするまでは順調に進んでいました。
GAE サイトでこのデモを見つけましたが、動作していないようです。私が経験しているハードルを説明したいので、この投稿はおそらくかなり長くなるでしょう。このデモを修正する方法または別の ajax アプローチを使用する方法について、提供できるヘルプまたは洞察を大歓迎します。
参考までに、Python 2.7 で Google App Engine を使用しており、32 ビットの Ubuntu 12.04 を実行しています。また、このトピックに関して他の質問が寄せられていることは承知していますが、満足のいく回答は見つかりませんでした。
...
そのため、デモから始めて、必要な、、およびファイルを というディレクトリにコピーindex.html
しmain.py
ましapp.yaml
たget
。指示に従って、サブディレクトリ も作成し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.py
main.app
libraries
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 にするためのより良い方法についての考えは、大歓迎です。