Python – 塵芥空間

Category: Python

Pylonsの情報源

Posted by – 2009年10月7日

Pylons HQ ここが総本山です。基本的にはここに全ての情報がある(英語)ここにwebhelpersなどの情報が集約されています。

Pylons HQ 日本語版 有志にによる日本語ページ。日本語情報は貴重

fujishinko 雑記帳 Pylonsの情報が多く書かれたblog、特に0.97に関する情報をたくさん得ることができました。

Emerge TechnologyそろそろPython始めてみませんか?』の『5 WSGIとPylons』はPylonsの有益な情報

Pylons 0.97で変更になった点 補足

Posted by – 2009年10月7日

0.97で変更になたもの
変更前変更後注釈
h.urlh.url_forlib/helpers.py に from routes import url_forを記述する必要あり
h.text_fieldh.textlib/helpers.py に from webhelpers.html.tags import *を記述する必要あり。h.text_fieldもWebhelpers.rails.form_tagをインポートすれば使用可能だが、0.97以降推奨されない。
h.text_areah.textarea上に同じ
h.radio_buttonh.radio上に同じ
h.submit-h.submit(‘button_title’) -> h.submit(’submit_name’,'button_title’)引数が2個になりました。ボタン表面に現れる文字は第一引数です。
h.stylesheet_link_tagh.stylesheet_link

基本的には_tagや_toなど_…と言った形式のものが、シンプルな名前に変わっている。古い形式での呼び出しも、webhelpers.rails.form_tagをimportすればサポートされているようですが、ロードマップから長期的には廃止の方向で進んでいるようです。また、テンプレートエンジンのMakoが最近のバージョンで標準設定はhtmlをエスケープする仕様になったようでwebhelpers.rails関係は${h.text_field(‘name’) | n}のように明示的にエスケープしないようにする必要があるようです。この辺は、0.97からはじめた自分にはいまいちよくわかりません。少なくとも、h.text_fieldを含むh.formはMako上でエスケープされてしまい困って、結局 | n (標準フィルタ、エスケープしない)でごまかす必要がありました。

h.textを呼び出せばそんな問題もないし、使い方含め大幅に変わるものではないので、h.textなどwebhelpers.html.tags以下のものを使っていくべきでしょう。

例外として、link_toなどは名前が変わっていません。恐らく、今後のバージョンアップで変わると思いますけど :-D

Pylonsはじめました。

Posted by – 2009年10月7日

Pylonsと言うPython用のアプリケーションフレームワークを使い始めました。まだまだ、はじめたばかりで右も左もわからないのですが。少し使ってみた感じでは、柔軟性は非常に高いのですが、色々とお節介な機能があってサクサク書ける感じではなく、あくまでもシンプルなフレームワークですね。

メタフレームワークや、フレームワークのフレームワークと呼ばれるようにWSGI基準の各種ライブラリを疎結合した感じで構成されていて、テンプレートエンジンから、ORMその他殆ど全ての構成部品を別なものに変えることさえできます。まだ使って3日目ですが発展途上な印象で、バージョンアップ毎にたくさん変更点があります。現在の最新版は0.97ですが、0.97でも、0.96でも、0.95でも比較的大きな変更があったようで、ドキュメントがどれを読んでよいのか非常に困ります。

とりあえず、少しいじって分かった範囲で書いておきます。

まず、Pylonsで検索すると出てくる、Pylonsの日本語ページはじめてのPylonsが自分の環境(CentOS 5.3 Python 2.6.2(ソースからインストール)Pylons 0.97)では動きませんでした。さまざまなな言語、環境をいじりましたがHello Worldが一回で動かなかったのはこれが初めてです。

とりあえず、問題になったのは、helloworld/config/routing.pyの下記の部分で、これは他のドキュメントを読めばあっさり対応できます。

map.connect('', controller='hello', action='index')
map.connect(':controller/:action/:id')
map.connect('*url', controller='template', action='view')

上記は、0.96までの形式のようで、0.97からは次のように書くと動きます。少し冗長に書いてみました、この方がこの後実験するのに便利だから

map.connect('/', controller='hello', action='index')
map.connect('/{controller}')
map.connect('/{controller}/{action}')
map.connect('/{controller}/(action}/{id}')
map.connect('*url', controller='template', action='view')

1行目の’’は’/'にしないとダメなのと、:で始まってたのが{…}に変更になったようです。pasterで作った雛形でも次のようになってるので冗長に書かないとダメっぽいです。

# CUSTOM ROUTES HERE

 map.connect('/{controller}/{action}')
 map.connect('/{controller}/{action}/{id}')

http://127.0.0.1:5000にアクセスしたケースに該当するのが、map.connect(‘/’, controller=’hello’, action=’index’)

http://127.0.0.1:5000/helloにアクセスしたケースに該当するのが、map.connect(‘/{controller}’)

http://127.0.0.1:5000/hello/indexにアクセスしたケースに該当するのが、map.connect(‘/{controller}/{action}’)

http://127.0.0.1:5000/* で上記以外に該当するのがmap.connect(‘*url’, controller=’template’, action=’view’)

map.connect(‘/’, controller=’hello’, action=’index’)はpublic/index.htmlを消さないと動作せず、index.htmlが表示されます。

『6 テンプレートとリクエストのサイクル』もそのままでは動作しません。たぶん、AttributeError: ‘module’ object has no attribute ‘url_for’と言うエラーが出ます。そのものズバリな回答が、本家のコメントに載っていますJoseph Rawsonさんが書いてるコメントで

While this worked, I got a DeprecationWarning using this method. My solution was to insert these two lines in hello.py under the “from helloworld.lib.base import *” line.

from routes import url_for
h.url_for = url_for

This seems to work OK.

I couldn’t import routes in hello.py and then call routes.url_for() in the mako file, as it seems that routes becomes undefined there. I tried “from routes import url_for” and just called the function, but that also caused the same error. Attaching the function to the “h” module was the only way I could get it to work.

という部分と、本人によるそのフォローで

It’s probably easier to just add this statement to lib/helpers.py
from routes import url_for

上記です。要はlib/helpers.pyにfrom routes import url_forを追加すればOK。h.url_for = url.forは追加しないほうが無難です。これはlib/base.pyでimport プロジェクト名.lib.helpers as h(プロジェクト名はhelloworldとか、pasterで決めたやつです)とかにした方が便利です。と言うのもあとあとhelprs.pyにwebhelpers系のライブラリをごっそりとインポートする必要があるので、それら全てをh呼び出せたほうが便利だからです。

これで、/hello/serverinfoは表示できるはずです。次のサンプルはいきなりQuickWikiなんですがちょっと挫折しました。ドキュメントと異なる部分が結構あるので自分のような初心者には無理と判断して、Emerge Technologyさんのsimplebbsで勉強する事にしました。これも例によって0.97だとまずい部分がそこそこあります。勉強用には本当にシンプルかつ必要な事が多いので、Hello Worldの次のステップにちょうど良いです。QuickWikiは無理がありすぎです。

それに関しては次回。(一応、simplebbsの0.97対応の変更は終わってちゃんと動作しました)

from routes import url_for

Performance Optimization WordPress Plugins by W3 EDGE