投稿日:

MacOSX Lion + MAMP + WSGI で Python の HelloWorld


表題通りですが、MacOSX Lion 上の MAMP で Python WSGI Web Application を動かす為のセットアップめもです。
ネットに色々と情報はあるのですが、画像とかを静的にアクセスするための情報などと一緒になったものは見当たらなかったので、ここにメモしておきます。なお、本記事は次のツールは準備済のお話です。

  • MAMP(http ポートを80番に変更)
  • Python
  • Homebrew

では、まずは mod_wsgi をインストールします。
コンソールを立ち上げて Homebrew でインストールします。
超ー簡単です。

実行するとインストールログがツラツラと表示されますが、その中に、丁寧に以下のような説明まで書いてあります。このパスが mod_wsgi 本体っすね。探さなくと良いので、ちょっと嬉しい配慮です。

上記の情報をもとに、httpd.conf に mod_wsgi を登録します。

僕的に httpd.conf には MAMP の modules のパスを記述したかったので、シンボリックリンクを作成しました。

それから MAMP の httpd.conf を変更します。

次の行を追加。

それから、wsgi アプリケーションのエントリポイントを WSGIScriptAlias で登録します。

僕の場合、MAMP でバーチャルホストしてるので以下のような記述になりました。

WSGIScriptAlias が、wsgi アプリケーションのエントリポイントとなる Python スクリプトのパスです。ここでは、Alias で記述された項目を除いてルート以下の全てのリソースへのアクセスを /wsgi/public/main.py に送っています。

Alias の記述は、favicon や javascript、画像ファイルなどを静的に表示するためのおまじないです。ww
この記述が無いと、全てのリクエストは /wsgi/public/main.py に送られます。
ここでは、 /style/、/lib/、/media/ 以下の全てのファイルと、robots.txt、favicon.ico を、静的にアクセスできるように設定しています。

 

仕上げに、バーチャルホストの為に hosts にエントリを追加します。

 

あとはアプリケーションをごにょごにょと準備します。

/wsgi/public/main.py

以上です。

ブラウザで http://dev.wsgisample.jp/ へアクセスすると Hello World! が表示されます。

参考

 

 

投稿日:

eepy – Python コード埋め込み形のシンプルなテンプレートエンジン


Python コードを埋め込む形式のシンプルなテンプレートエンジンです。Ruby の ERB のような感じです。まだ検討したいところも多々ありますが、もしお役に立ちそうに思われた方はご自由にお使いください。で、何か不具合があれば教えてください♪

特徴

  • Ruby の ERB 風の記法
  • Python のインデントブロックを意識せず、テンプレートを記述可(”end” キーワードの使用)
  • フィルタ。値の埋込み時に、html クォートなどのフィルタを自動的・全般的に適用可
  • キャッシュ。Renderer 利用時に利用可
    • メモリ保持で揮発性の1次ファストキャッシュ(1トランザクション内でのテンプレートの繰り返し利用の為)
    • 2次キャッシュ。コンパイル済みのテンプレートの永続化。現在、File ベースと、Gae Memcache ベースのストレージを準備。他の DB ストアなど、必要に応じてストレージを追加可
  • ヘルパ。幾つかの便利なヘルパを提供
    • extends と block。Django のような、テンプレートを継承・拡張するスタイルを利用可
    • include。テンプレート中で、他のテンプレートを読み込み

なお、eepy は、yuin さんの embpy をベースとした派生ライブラリです。
また、キャッシュのストレージ仕様は、kuwata-lab.compyTenjin を参考にさせて頂いています。

embpy との主な相違点(2010.02.10時点)

  • ブロックの終わりの明示は end キーワードでのみ可
  • インラインでブロックを記述する時に、{: ~ :} の記述が不要(普通に書けます)
  • 複数行のコードパートにブロックを書く時は、end キーワードは不要(普通に書けます)
  • 三項演算子が利用可
  • render の戻り値は、unicode

ドキュメント

モジュール、クラス、メソッドに記載の doc を参照してください。

テンプレート(template.html/utf8):

Python コード:

出力結果:

ソースコード

次の URLにて公開しています。

https://github.com/yuka2py/eepy

 

 

 

投稿日:

cnvk – Python で全角・半角・ひらがな・カタカナ等を変換する


Python で半角・全角の変換やカタカナとひらがなの変換などを行う簡単なモジュールを作ったので貼っておきます。他にも似たライブラリがありますがその一つとして。もしお役に立ちそうに思われた方はご自由にお使いください。で、何か不具合があれば教えてください♪

特徴

  • unicodedata よりは色々細かく指定できます。
  • 追加の変換テーブルを指定するのも簡単です。
  • 変換しない文字を指定できます。
  • 変換方法は単純に replace です。正規表現ほか色々と試したんですが、たぶん早い方です。

ドキュメント

モジュール、関数に記載の doc を参照してください。

ダウンロード

https://github.com/yuka2py/cnvk

コード

 

投稿日:

ファイル内に子モジュールを作る


時々、子モジュールに収めたい機能があるけどファイルは一つにしたいとか、同じモジュールファイル内に子のモジュールを作りたい時があるので、やってみました。

関数からモジュールを作る(デコレータ利用)

モジュール定義用の関数の中で、最後に return locals() ってのがイケていないですが、色々考えても回避できませんでした。orz…

クラスからモジュールを作る(メタクラス利用)

Python 3 なら、クラスデコレータを使えるでしょうかね。

なお、特にクラス定義を使いたい理由がなければ、上の関数定義を利用する方が、モジュールコンテンツのコーディング上便利だと思います。

定義したモジュールのインポート

例えば上述の定義を hoge モジュールに書いている場合、次のような感じで通常のモジュールのように呼び出せるようになります。

どうでしょうか?

 

 

投稿日:

GAE の Datastore の Timeout 対策


Google App Engine のデータストアって、よく Timeout しますよね。(;^ω^)
本日、単純な Model.get() が Timeout したので、さすがに我慢できなくてリトライするように変更してみました。何かの参考になればとコードをアップしておきまーす♪

 

※_original_func 関連のコードは別に無くても良いのですが、ローカルの開発環境ではコードの修正などに伴って問題が出ることがあるので、追加しています。たぶん本番環境では不要ですね。

なお、この変更にもし問題などが有りましたら、ご指摘頂けたら助かります!