チケット #226 (new ブログ) — at バージョン 2
登録: 17 年 前
最終更新: 17 年 前
GoogleAppEngineでTracは動くのか!?(挫折編)
報告者: | hirobe | 担当者: | weekbuild |
---|---|---|---|
優先度: | (´ー`*) | コンポーネント: | TracDoc |
バージョン: | キーワード: | ||
関係者: |
説明 (最終更新者: hirobe) (diff)
チャララッチャッチャ。3時間クッキングの時間です。材料は、旬のGoogleAppEngineSDK と Trac0.11rc1 ,Gneshi 0.4.4です。
GoogleAppEngineはアカウントを取得し、SDKでHellowWorldが表示できるところまで下ごしらえをしておいてください。
GoogleAppEngineの使いかたについては、 こちらのブログ をおススメします。すごいねぇ。
下調べ
さて、まず GoogleAppEngineの資料 を取り出しましょう。Python2.5.2が動くけど、いろいろ制限はあるようです。
- DBはGoogleが用意したDatastoreを使え(でも、Python2.5.2ならSQLiteが使えるのかな?)
- PurePythonなコードしか使えません。C拡張を使うのはダメってこと。これはPython Standard Libraryであっても同様。(たとえば、tempfileは不可)
- 基本的に、サーバ内のファイルに書き込みできません。データを蓄えたければ、AppEngineのデータストアを使用してください。
- socket通信は不可。HTTP,HTTPSのみURLFetchサービスを使えばOK
- サブプロセスやスレッドは不可
- リクエストに対する処理があまり長いと、切断されるよ
- signalsのようなシステムコールは使えません
制限を読むと、難しそうですねぇ。
材料を並べる
まず、作業フォルダをつくります。GoogleにUPするさいのアプリケーションIDを名前につけましょうか。
そこに、材料(Trac0.11rc1とGenshi 0.4.4)を並べます。材料は解凍して、作業フォルダからPythonがパスをうまくたどれるようにきれいに並べましょう。以下のようなフォルダ構成になればOKです。
さらに、repos_parentというフォルダを同じフォルダ下に作ります。これは、TracEnvを置く親フォルダです。その下に、TracEnvのフォルダを配置します。TracEnvは事前に作成しておいてください。TracEnvのフォルダをソースと同様に扱うということは、Tracから書き換えできなくなるということですが、その解決方法は後で考えます。
つづけて、app.yamlをおきます。中身はこんな感じ
application: [アプリケーションID] version: 1 runtime: python api_version: 1 handlers: - url: /.* script: trac_gae.py
trac_gae.pyを呼び出す形で書いていますね。trac_gae.pyを作ります。gaeはGoogleAppEngineの略です。ちなみにこのソースは、 ここ を参照しています。
import os os.environ['TRAC_ENV'] = 'repos_parent/[TracEnvのフォルダ名]' import trac.web.main application = trac.web.main.dispatch_request
こんな感じの構成になりましたか?(イメージ中devtracというフォルダがTracEnvのフォルダです)
余談:データアクセスについて
GoogleAppEngineは、ファイルの書き込みを許さず、DBとしてはDatastoreなるものしか使えない。これにより、既存のPythonのWebアプリはそのままではまず動作しない。
ただし、Tracでは0.10以降、さまざまな種類のDBサーバに対応するために、DBアクセス部分をプラグイン化しており、GoogleAppEngineのDatastore用のプラグインを作れば、動くかもしれないと期待できある。動くといいなぁ。
火を通す
では、動かしてみます。
エラーになった。
File "c:\python25\lib\site-packages\Trac-0.11b2-py2.5.egg\trac\__init__.py", l ine 14, in
どうやら、先ほど配置したのと別のTrac(このPCにはもうひとつTracがインストールしてある)を見に行っているようだ。そっちじゃないよ!
うまくわける方法が分からんので、とりあえずPythonインストールフォルダのsite-packagesフォルダを変名する。.bakをつけとこう
さあ、どんどんエラーが出てきた。めげずにがんばろう
ImportError: No module named pkg_resources
この辺は、どんどんモジュールを加えていこう。ちなみに、pkg_resourcesはsetuptoolsに入っている。 ここから ソースをダウンロードしてsetuptoolsフォルダとpkg_resourcesフォルダを作業フォルダにいれる。
File "C:\doc\GoogleAppEngine\irove\pkg_resources.py", line 23, in ImportError: cannot import name utime
さっきも見たな。このエラー。
なぜかsite-packageの方のTracを参照してしまう。site-package内のTracを変名して回避成功。
File "C:\doc\GoogleAppEngine\irove\pkg_resources.py", line 1247, in _get stream = open(path, 'rb') File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_apps erver.py", line 739, in __init__ raise IOError(errno.EACCES, 'file not accessible') IOError: [Errno 13] file not accessible
open(path, 'rb')が使えなさそうだということころで、挫折orz。
まとめ
そんなわけで、今回は大失敗に終わったのだが、まだ希望がないわけではない。
ここ で、setuptoolsをつかう方法が紹介されているのだっ!!Pylonsって何か知らんけど。
もうちょっと勉強して、再チャレンジしよう。