web2py:アプリケーションを作ってみる

以下の記述は、applications/init下のアプリケーションとして統一する。

今までPHPのYiiで作っていたサイトの機能を置き換えるというのが目標(*1)。

Yamlで設定ファイル

GAEの設定でも使われているYAMLで、設定ファイルをyamlファイルで作る。

pip install PyYAML

設定ファイルの置くパスをmodelsにする。同じくmodels内に0.pyを作り

import yaml

p = os.path.join(request.folder,'models','radio-age.yaml')

radio = yaml.load( open(p).read() )

とすれば、radio辞書変数でアクセス可能。

init名のアプリなら上のp/path/to/applications/init/models/radio-age.yamlがパスとなる。

このradio-age.yaml内が

foo: bar

なら、radio['foo']でbarにアクセスできる。

HatenaSyntax(はてな記法)の処理

YIIをつかう:その2」でも記したが、本サイトはPHPのフレームワークYiiにOpenPearのHatenaSyntaxを利用して「はてな記法」でHTMLを書いている。はてな記法は気に入っていて、今更やめたくない(*2)。

さて・・どうするか。HatenaSyntaxはPHPのPEGライブラリを用いて文書解析をしている。それにならえば(当然の如く日本原産のはてな記法用Pythonモジュールは存在しない)PythonのPEGモジュール(http://fdik.org/pyPEG/)を使いながら独自にパーザを書くことになる。でも能力的に力が足りなすぎるので無理。

ということで、ご通家からは目を背けられるかもしれないけど、PythonからHatenaSyntaxを使ったPHPファイルを呼び出すことにした:-p。

本サイトHTMLははてな記法を書いたHTMLをファイルシステムに格納しているだけなので(つまりDBを使っていないので)、ファイルパスをPHPで書いた「はてな記法パーザ」に渡して、解析結果をもらう。

call php from pythonでぐぐってトップの検索リンクhttp://stackoverflow.com/questions/166944/calling-python-in-phpでわかったsubprocessモジュールを使えばよろしそうだ。

import subprocess

result = subprocess.check_output(['php -f',「はてな記法パーザのフルパス」',解析対象のHTMLファイルパス])

パーザの中身は

$filepath = $argv[1];//引数で渡したHTMLファイルパス

include_once('HatenaSyntax.php');

$hatena = new HatenaSyntax();

$content = file_get_contents($filepath);

print $hatena->render($content);

成長したらPyPEGでパーザ書くんだ!という誓いをこころに秘めながら、まあ、これでいいだろと思う春の宵であった。

自作モジュールをインポートする

上のような独自機能をまとめるために、自作モジュールを作ってアプリケーションのモジュールディレクトリにおいてみよう。ここではradioparser.pyとする。

web2py/application/init/modules/radioparser.pyをインポートするには

cat web2py/application/init/modules/radioparser.py
def bar():
 return "hello world"

ならば

foo = local_import('radioparser')

foo.bar()

とすればいい(必ず変数にオブジェクトを代入して、アクセスする。)。local_importはlocal_import(モジュール名、reloadを繰り返し強制するか=False,モジュールパス)で、モジュールパスのデフォルトはrequest.application変数なので、なにも指定しないと、そのアプリケーション名(この場合はinit)のmodulesパスが探査される。

もしwelcomeにあるモジュールにinitアプリケーションからアクセスしたい場合はモジュールパスを'welcome'と設定すればいい。

index.htmlでextendを使った時に冒頭空白行が挿入される件

どのバージョンからなのか、もとからなのか分からないが

Version 1.99.7 (2012-03-04 22:12:08) stable(*3)

の場合、index.htmlで次のように書くと、出力されるHTMLの冒頭は空白行が挿入される。

{{なにかPython命令}}

{{extend 'layout.html'}}

....

....

....

下は、Another HTML-lintでチェックした画面。

no title


つまりextendの前に行があると空行が出力されるようなのだ。

web2pyを使っているいくつかのサイトを見まわったがそうなっているところが結構ある。

そもそもweb2py本家のHOMEがそうである(´∀`)。

no title


{{include}}文ならまだ理解可能なのだが、テンプレートの拡張ディレティブを使うと冒頭行が空行になるというのは回避する必要があるが、それには、

{{なにかPython命令}}{{extend 'layout.html'}}

....

....

....

という風にする。

ソースを見てないけど、template.pyの処理でバグってる、あるいは「仕様」なのかわかりません(*4)。




*1: 当然これを書いている時点(20120409)では、まだ置き換わっていないわけです。

*2: 目次の自動生成と脚注記述の簡便さはmarkdownとかの追随を許さないと思うのだ。

*3: gitHubで取得した1.99.7

*4: 以上は、2012年4月18日現在なので、それ以降どうなったかはわかりません。なお、これに限らずweb2pyのデフォルトレイアウト(layout.html)の文書宣言・HTMLのheadブロック関係の処理は綺麗じゃないというかちょっと無神経だとおもふ。

this file --> last modified:2012-04-19 01:33:18