この記事は、 Pyramid バージョン 1.3 とその前身である Pyramid 1.2 を比較して、新しい特徴について説明します。 さらに、2つのバージョンの間の後方非互換性と Pyramid 1.3 に 加えられた廃止 (deprecation) 、ソフトウェア依存性の変更、 特に重要なドキュメンテーションの追加について文書化します。
Pyramid 1.3 の主な機能追加は以下の通りです。
Pyramid は引き続き Python 2 上で動きますが、 Pyramid はさらに Python 3 互換になりました。 Python 3 の下で Pyramid を使用するためには Python 3.2 以上が要求されます。
多くの Pyramid アドオンが既に Python 3 互換になっています。例えば、 pyramid_debugtoolbar, pyramid_jinja2, pyramid_exclog, pyramid_tm, pyramid_mailer, pyramid_handlers はすべて Python 3 に対応しています。しかし、他のアドオンは Python 2 でのみ動く ことが知られています。さらに、 scaffold が依存するいくつかのパッケージ (特にZODB)は、まだ Python 3 の下で動きません。
Python 3 に対する全面的なエコシステムのサポートを獲得するまでの間 しばらく待ってください。進行中の移植作業に関しては https://github.com/Pylons/pyramid/wiki/Python-3-Porting でより多くの詳細を見ることができます。
Python 3 互換性のために、いくつかのパッケージ依存性の削除と、古い Python バージョンおよびプラットフォームのサポートを打ち切ることが必要で した。詳細は下記の “Backwards Incompatibilities” セクションを参照して ください。
私たちは paster コマンドを Pyramid 固有の類似品に置き換えました。 なぜか? paster コマンドを提供する Paste と PasteScript という名前のライブラリが Python 3 の下では動かず、それらのライブラリを 私たち自身で移植してメンテナンスすることに気が進まなかったからです。 その結果、いくつかの変更を加える必要がありました。
以前 (Pyramid 1.0, 1.1 および 1.2) は、 paster create を使って Pyramid アプリケーションを作成していました:
$ myvenv/bin/paster create -t pyramid_starter foo
1.3 では、その代りに pcreate を使用してアプリケーションを作成する 必要があります:
$ myvenv/bin/pcreate -s starter foo
内蔵の Pyramid scaffold のためには pcreate を使う必要があります; Pyramid の外部で配布された scaffold は、 pcreate と paster create の両方またはどちらかに対応しています。
Pyramid の前のバージョンでは、 Pyramid アプリケーションを起動するのに 以下のようにしていました:
$ myvenv/bin/paster serve development.ini
この代わりに 1.3 では pserve コマンドを使用しなければなりません:
$ myvenv/bin/pserve development.ini
Pyramid がサポートする ini 設定ファイルのフォーマットは変わっていま せん。そのため、 Python 2 のみを使っているユーザは、もしそうしたければ PasteScript を手動でインストールして paster serve を代わりに使用す ることができます。しかしながら、 pserve を使用すれば Python 2 と Python 3 の両方の下で動くでしょう。
paster pshell, paster pviews, paster request, paster ptweens にはそれぞれ、 pshell, pviews, prequest, ptweens という対応するコンソールスクリプトが存在します。
以前 scaffold の中で使用していた paste.httpserver サーバーが Python 3 互換ではないので、私たちは Pyramid scaffold によって使用される デフォルト WSGI サーバーを waitress サーバーに変更しました。 waitress サーバーは Python 2 と Python 3 の両方と互換性があります。
scaffold からプロジェクトを作成すれば development.ini と production.ini は次の行を持つでしょう:
use = egg:waitress#main
これの代わりに (古いバージョンではこれがデフォルトでした):
use = egg:Paste#http
Note
paste.httpserver はヘッダーの値が Unicode だった場合 string 文字列 に自動変換する機能がありました (それは WSGI 仕様に反した特徴でした)。 それに対して waitress サーバーは WSGI 仕様をより完全に実装しています。 これは特に、レスポンスのヘッダーを修正している場合に影響があるかもしれ ません。次のエラーがこの問題の指標になります: AssertionError: Header values must be strings, please check the type of the header being returned. よくあるケースは string ヘッダーの代わりに Unicode ヘッダーを 返している場合です。
新しく pyramid.compat モジュールが加えられました。 このモジュールは Pyramid アドオンおよび開発環境に対して Python 2/3 にまたがるサポートを提供します。
設定情報の introspection システムが加えられました; 開発者として introspection システムを使用することについての詳細は、 Pyramid Configuration Introspection と Configuration introspection の追加 を参照してください。
最新の Pyramid デバッグツールバー (0.9.7+) は、 Pyramid アプリケーション 開発者に introspection 情報を露出する “Introspection” パネルを提供します。
introspection をサポートするために新しい API が追加されました: pyramid.registry.Introspectable, pyramid.config.Configurator.introspector, pyramid.config.Configurator.introspectable, pyramid.registry.Registry.introspector
クラスをビューとして使用する場合、そのクラスに対して新しい pyramid.view.view_defaults クラスデコレータを使用することがで きます。このクラスデコレータを使うと、そのクラスのメソッドをデコレート するすべての @view_config デコレータによって使用されるビュー設定情報 にデフォルトを提供することができます。
例えば、 “REST アクション” を表わすメソッドを持つクラスがある場合、すな わち、すべてのメソッドが同じルートにマップされリクエストメソッドだけが 異なる場合、このようにする代わりに:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from pyramid.view import view_config
from pyramid.response import Response
class RESTView(object):
def __init__(self, request):
self.request = request
@view_config(route_name='rest', request_method='GET')
def get(self):
return Response('get')
@view_config(route_name='rest', request_method='POST')
def post(self):
return Response('post')
@view_config(route_name='rest', request_method='DELETE')
def delete(self):
return Response('delete')
|
こうすることができます:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from pyramid.view import view_defaults
from pyramid.view import view_config
from pyramid.response import Response
@view_defaults(route_name='rest')
class RESTView(object):
def __init__(self, request):
self.request = request
@view_config(request_method='GET')
def get(self):
return Response('get')
@view_config(request_method='POST')
def post(self):
return Response('post')
@view_config(request_method='DELETE')
def delete(self):
return Response('delete')
|
これは、クラスに作用する命令的なビュー設定でも同様に機能します。
詳細は @view_defaults Class Decorator を参照してください。
プロパティディスクリプタを持つ pyramid.request.Request オブジェクトを、カスタムリクエストファクトリを作ることなく拡張すること ができるようになりました。新しいメソッド pyramid.config.Configurator.set_request_property() は、アドオンに 対し各リクエストに加えられるプロパティを登録するためのエントリポイント を提供します。新しいプロパティは、インスタンスのライフタイムにおいて 返り値を事実上キャッシュして、具象化されるかもしれません。このための 通常のユースケースは、リクエストのためにデータベース接続を得たり、 カレントユーザーを識別したりすることです。新メソッド pyramid.request.Request.set_property() も追加されましたが、 configurator メソッドの方が、プロパティのライフタイムにおける 矛盾検知および一貫性を提供するので推奨されます。
Not Found ヘルパー:
Forbidden ヘルパー:
Pyramid はもう Python 2.5 上で動きません。これは Jython の最新の リリースおよび Google App Engine の Python 2.5 バージョンを含みます。
理由? Python 2 と 3 の複数のバージョンに「またがって (straggle)」かつ Python 2.6 以前の古い Python 2 バージョンをサポートすることは容易では ありません。Pyramid のこのバージョンを実行するには Python 2.6 以上が 必要です。もし Python 2.5 を使用する必要があれば、 Pyramid 1.2.X の 最新のリリースを使用してください。
Pyramid.request.Request.route_url() または Pyramid.request.Request.route_path() に渡された “remainder” マッチを置き換えることを意図した文字列の値は、埋め込まれたスラッシュ を除いて URL クォートされるようになりました。例えば:
config.add_route('remain', '/foo*remainder')
request.route_path('remain', remainder='abc / def')
# -> '/foo/abc%20/%20def'
以前は、 remainder 置換として渡された文字列の値は URLクォートされる ことなくそのまま扱われていました。しかし、渡された値が Unicode である 場合、これは実際のところ理論的に動きません(生の Unicode は URL または パスに含めることができません)。また、値が文字列である場合、それは他の URL 生成機構と一致しません(呼び出し元でしなければ、 URL クォートされ ません)
pyramid.interfaces.IContextURL インターフェースが廃止されました。 Pyramid 1.0 以降、カスタムトラバーサーによって見つかったリソースに対する pyramid.request.Request.resource_url() URL 生成に影響を及ぼすために リソース URL アダプターを登録するのにこれを使用するように “Hooks” 章の中で 指示されていました。
このインターフェースはまだ存在します。また、古いバージョンで文書化 されていたようにそれを使用してアダプターを登録することはまだ動きます。 しかし、このインターフェースは Pyramid のいくつかのメジャーリリース後 にソフトウェアから除去されるでしょう。新しい pyramid.config.Configurator.add_resource_url_adapter() APIを使用 して登録された等価な pyramid.interfaces.IResourceURL() アダプター に置き換えてください。 pyramid.request.Request.resource_url() が呼ばれたときに pyramid.interfaces.IContextURL アダプターが見つかった場合、 deprecation 警告が発生します。