Pyramid 1.4 の新機能
この文書では Pyramid バージョン 1.4 をその前身である
Pyramid 1.3 を比較した場合の新機能について説明します。また、 2 つの
バージョン間の後方非互換性と Pyramid 1.4 に加えられた deprecation
(廃止予定) に加えて、ソフトウェア依存関係の変更とドキュメンテーションの
顕著な追加分をドキュメント化します。
メジャー機能追加
Pyramid 1.4 の主な追加機能は以下の通りです。
容易なカスタム JSON シリアライズ
- ビューがカスタムオブジェクトを返すことができるようになりました。
カスタムオブジェクトは、そのオブジェクトのクラスに __json__ メソッド
を定義することにより JSON レンダラーによって JSON にシリアライズされます。
このメソッドは json.dumps によってネイティブにシリアライズできる値
(int, list, 辞書, 文字列など) を返さなければなりません。
詳細は カスタムオブジェクトのシリアライズ を参照してください。
返されたオブジェクトに __json__ メソッドを追加することができない場合、
さらに JSON レンダラーは未知のオブジェクトを JSON シリアライズに変換
するためのカスタム型アダプタを定義することができるようになりました。
Mako と Chameleon の部分的なテンプレートレンダリング
- Mako レンダラーが asset spec 中での def 名の使用をサポートするように
なりました。 asset spec 中に def 名がある場合、システムはテンプレート
全体をレンダリングする代わりに、テンプレート内の def で指定された
テンプレートをレンダリングします。 def を指定する asset spec の例は
package:path/to/template#defname.mako です。これは、テンプレート
全体をレンダリングする代わりに template.mako テンプレートの内部の
defname という名前の def をレンダリングします。
ビューから ('defname', {}) 形式でタプルを返す古い方法は、後方互換性
のためにサポートされます。
- Chameleon ZPT レンダラーが asset spec 中でのマクロ名の使用をサポート
するようになりました。 asset spec 中にマクロ名がある場合、システム
はテンプレート全体をレンダリングする代わりに define-macro として
リストされたマクロをレンダリングして結果を返します。
asset spec の例: package:path/to/template#macroname.pt 。
これは、テンプレート全体の代わりに template.pt テンプレート中で
macroname として定義されたマクロをレンダリングします。
マイナー機能追加
- このリリースから、 request_method ビュー/route 述語が使われている場合に
GET が指定されたら HEAD も指定されたものとみなすようになりました。
例えば、 @view_config(request_method='GET') を使うことは
@view_config(request_method=('GET', 'HEAD')) を使うことと等価です。
@view_config(request_method=('GET', 'POST') を使うことは
@view_config(request_method=('GET', 'HEAD', 'POST') を使うことと等価です。
これは HEAD が body を省略した GET の変種であるためです。また、 WebOb には
HEAD が使用された場合に空の body を返すための特別なサポートがあります。
- 述語不一致例外が起きた場合 (述語が働かないために与えられたリクエストに
一致するビューがない場合に見られる) 、一致しなかった述語に関するテキストの
説明が例外に含まれるようになりました。
- check_csrf ビュー述語が追加されました。これにより、例えば
config.add_view(someview, check_csrf=True) ができるようになります。
この述語がチェックされた時に、 request.params 中の csrf_token の
値がリクエストのセッション中の csrf トークンと一致すればビューは実行を
許可されます。そうでなければ実行は許可されません。
- 命令的に定義されたテーブルが動作するように、
Base.metadata.bind = engine が alchemy scaffold に追加されました。
- scaffold の .ini ファイルにドキュメンテーションへの参照を含む
コメントが追加されました。
- pyramid.config.testing_securitypolicy() によって生成された
DummySecurityPolicy が、 forget メソッドが呼ばれた場合にそのポリシーの
forgotten 値を (値 True に) 設定するようになりました 。
- pyramid.config.testing_securitypolicy() によって生成された
DummySecurityPolicy が、そのポリシーの remembered 値を設定する
ようになりました。それは remember メソッドが呼ばれたときに渡される
principal 引数の値です。
- 新しい physical_path ビュー述語。もし指定された場合にはその値は文字列
またはタプルで、それらはこの述語がマッチする、トラバーサルによって見つかった
コンテキストの物理的なトラバーサルパスを表わします。例えば:
physical_path='/' や physical_path='/a/b/c' や
physical_path=('', 'a', 'b', 'c') です。これは、あるオブジェクトが
トラバーサルされる時に潜在的に常にあるビューを表示したいけれども、
それがどんな種類のオブジェクトになるかは分からず、したがって
context 述語を使用することができない場合に便利です。
- effective_principals route/ビュー述語が追加されました。
- pyramid.view.view_config に _depth 引数を渡すことができる
ようになりました。それは、他のソフトウェアが view_config によく似た
カスタムデコレータを提供したい場合に、デコレータの制限された合成再使用
を可能にします。
- すべての p* コマンド (pserve, pshell, pviews など) で
a=1 b=2 形式で可変引数を使用することができるようになりました。
それによりパラメータ化された .ini ファイル中の値を埋めることが
できます (例えば pshell etc/development.ini http_port=8080)。
- ユーザがサブスクライバ callable に対する未使用の引数を無視したり、
イベントサブスクライバとサブスクライバ述語の関係を標準化することが
できるように、複数のインタフェースを伴う通知に対して登録されたとしても
サブスクライバとサブスクライバ述語の両方が単一の event 引数だけを
受け取ることができるようになりました。
後方非互換性
- Pyramid ルーターは、リクエストの WSGI 環境辞書に値
bfg.routes.route や bfg.routes.matchdict を追加しなくなりました。
これらの値は repoze.bfg 1.0 (事実上マイナーリリース 7 つ前) で
deprecated とドキュメント化されています。
あなたのコードがこれらの値に依存している場合は、代わりに
request.matched_route と request.matchdict を使用してください。
- pyramid.traversal.ResourceTreeTraverser.__call__
(別名 ModelGraphTraverser.__call__) に environ 辞書を直接渡すことは
できなくなりました。代わりにリクエストオブジェクトを渡す必要があります。
リクエストの代わりに environ を渡すと、 Pyramid 1.1 からは deprecation
警告が発生していました。
- リクエストファクトリとして webob.request.LegacyRequest を使用している
場合、 Pyramid は正常に動作しなくなりました。 LegacyRequest クラスの
インスタンスには文字列を返す request.path_info があり、Pyramid の
このリリースは request.path_info が無条件でユニコードであることを
仮定しています。
- pyramid.configuration モジュールが削除されました。このモジュールは
Pyramid 1.0 から deprecated になり、使用すると deprecation 警告が表示
されていました。代わりに pyramid.config を使用してください。
- pyramid.paster.PyramidTemplate API が削除されました。それは
Pyramid 1.1 から deprecated になり、インポート時に警告が出ていました。
あなたのコードがこれに依存している場合、代わりに
pyramid.scaffolds.PyramidTemplate をインポートするように
コードを修正してください。
- pyramid.settings.get_settings() API が削除されました。この API は
Pyramid 1.0 から deprecation 警告が表示されていました。あなたのコードが
この API に依存している場合は、代わりに
pyramid.threadlocal.get_current_registry().settings を使用するか、
リクエストからアクセス可能なレジストリの settings 属性
(request.registry.settings) を使用してください。
- Pyramid 1.3 とそれ以前には、ビューによって返された Response オブジェクトの
__call__ メソッドがすべての finished コールバックが実行される前に
起動されていました。このリリース以降、Response オブジェクトの
__call__ メソッドはfinished コールバックが実行された後に起動されます。
これは pyramid.request.Request.invoke_subrequest() 機能をサポート
するためです。
ドキュメントの強化
- Upgrading Pyramid の章が narrative ドキュメンテーションに追加
されました。この章は、 Pyramid API の deprecation と削除に対処する方法、
テストを実行している間やサーバーを起動している間に Pyramid によって
生成された deprecation 警告を表示する方法について記述します。
- narrative および API ドキュメントに対して多くの整理と改善が行われました。
依存関係の変更
- Pyramid は WebOb 1.2b3+ を要求するようになりました(以前の Pyramid
リリースは、 1.2dev+ に依存していました) 。これは、
request.path_info をテキストとして返す WebOb のバージョンを確実に
得るためです。