Pyramid 1.3 の新機能

この記事は、 Pyramid バージョン 1.3 とその前身である Pyramid 1.2 を比較して、新しい特徴について説明します。 さらに、2つのバージョンの間の後方非互換性と Pyramid 1.3 に 加えられた廃止 (deprecation) 、ソフトウェア依存性の変更、 特に重要なドキュメンテーションの追加について文書化します。

メジャー機能追加

Pyramid 1.3 の主な機能追加は以下の通りです。

Python 3 互換性

_images/python-3.png

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 コマンドが置き換えられました

私たちは paster コマンドを Pyramid 固有の類似品に置き換えました。 なぜか? paster コマンドを提供する PastePasteScript という名前のライブラリが 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 は、 pcreatepaster 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.httpserverwaitress で置き換えられました

以前 scaffold の中で使用していた paste.httpserver サーバーが Python 3 互換ではないので、私たちは Pyramid scaffold によって使用される デフォルト WSGI サーバーを waitress サーバーに変更しました。 waitress サーバーは Python 2 と Python 3 の両方と互換性があります。

scaffold からプロジェクトを作成すれば development.iniproduction.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 システムが加えられました; 開発者として introspection システムを使用することについての詳細は、 Pyramid Configuration IntrospectionConfiguration 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

@view_defaults デコレータ

クラスをビューとして使用する場合、そのクラスに対して新しい 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 を参照してください。

サブクラス化をしない Request 拡張

プロパティディスクリプタを持つ pyramid.request.Request オブジェクトを、カスタムリクエストファクトリを作ることなく拡張すること ができるようになりました。新しいメソッド pyramid.config.Configurator.set_request_property() は、アドオンに 対し各リクエストに加えられるプロパティを登録するためのエントリポイント を提供します。新しいプロパティは、インスタンスのライフタイムにおいて 返り値を事実上キャッシュして、具象化されるかもしれません。このための 通常のユースケースは、リクエストのためにデータベース接続を得たり、 カレントユーザーを識別したりすることです。新メソッド pyramid.request.Request.set_property() も追加されましたが、 configurator メソッドの方が、プロパティのライフタイムにおける 矛盾検知および一貫性を提供するので推奨されます。

Not Found と Forbidden ビューヘルパー

Not Found ヘルパー:

  • 新 API: pyramid.config.Configurator.add_notfound_view() 。 これは pyramid.Config.configurator.add_view() のラッパーで、 “append_slash” 機能のサポートを提供すると同時にパーミッションに関して 正しいことを行います (not found ビューは常に public であるべきです)。 以前に推奨されていた context=HTTPNotFoundadd_view を直接 呼び出すよりも、こちらの方がより好まれます。

Forbidden ヘルパー:

  • 新 API: pyramid.config.Configurator.add_forbidden_view() 。 これは pyramid.Config.configurator.add_view() のラッパーで、 パーミッションに関して正しいことを行います。 以前に推奨されていた context=HTTPForbiddenadd_view を直接 呼び出すよりも、こちらの方がより好まれます。

マイナー機能追加

  • Mako テンプレートを使用するために mako.directories 設定は必須で なくなりました。根拠: Mako テンプレートレンダラーは絶対 asset spec を 使用して指定することができます。アプリケーション全体を、順序付きのルッ クアップパスを要求せずに、そのような asset spec で書くことができます。
  • pshell における bpython インタープリター互換性。詳細は IPython or bpython を参照してください。
  • pyramid.paster.get_appsettings() API 関数が追加されました。 この関数は、 PasteDeploy ini ファイルの [app:...] セクション内に 定義された設定を返します。
  • pyramid.paster.setup_logging() API 関数が追加されました。 この関数は、 PasteDeploy ini ファイル中の logging 設定に従い Python logging をセットアップします。
  • 設定衝突レポートは、より理解しやすい方法で報告されます。 (“Line 11 in file...” vs. 同じ情報のタプルの repr)
  • pyramid.config.Configurator.scan() メソッドは ignore 引数 を渡すことができます。それは、文字列、 callable 、または文字列と callable からなるリストです。この機能は、スキャンからサブモジュール、 サブパッケージおよびグローバルなオブジェクトを許可します。 スキャンに ignore 引数を使用する方法についての詳細は、 http://readthedocs.org/docs/venusian/en/latest/#ignore-scan-argument を参照してください。
  • pyramid.config.Configurator.add_travers() API メソッドが追加され ました。詳細は トラバーサーの変更 を参照してください。 これは新機能ではありません。単に ZCA API を使用する必要なしにトラバーサー を追加するための API を提供します。
  • ビュー callable がレスポンスに変換できない値を返したとき (例えば、ビュー callable がレンダラー定義なしで辞書を返した場合、ある いは値を全く返さない場合) のより良いエラーメッセージ。エラーメッセージ には、ビュー callable 自身に関する情報と、それを呼んだ結果が含まれる ようになりました。
  • .pyc のみのモジュールが config.include された場合のより良いエラー メッセージ。これはエラー報告の必要条件により許可されず、それが試みら れた場合より良いエラーメッセージが示されます。以前は、以下のような エラーが出て失敗していました: “AttributeError: ‘NoneType’ object has no attribute ‘rfind’”
  • システム値 reqrequest の別名としてレンダラーに提供される ようになりました。これは、例えばテンプレートの中で、 request.route_url(...) の代わりに req.route_url(...) のように できるということです。これは純粋にテンプレートに内部でリクエストメソッド と属性を使用するのに必要なタイピング量を減らすための変更です。 値 request もまだ利用可能です。これは単に別の選択肢です。
  • 新しいインターフェースが追加されました: pyramid.interfaces.IResourceURL 。このインターフェースを 実装するアダプターは、 pyramid.request.Request.resource_url() が呼ばれる際にリソース URL 生成を無視するために使用することができます。 このインターフェースは今では廃止された pyramid.interfaces.IContextURL インターフェースを置き換えます。
  • リソースの __resource_url__ メソッドに渡された辞書 (リソース URL 生成のオーバーライド を参照) は、 pyramid.request.Request.resource_url() で生成されたアプリケーション URL を表わす app_url キーを含むようになりました。それは、潜在的 にカスタマイズされた URL プレフィックスを表わします。ユーザによって request.resource_url に渡された潜在的なカスタムスキーム、ホスト およびポート情報が含まれます。必要なところでは、 request.application_url の代わりに使用されるべきです。
  • pyramid.request.Request.resource_url() API はこれらの引数を 受け取るようになりました: app_url, scheme, host, portapp_url 引数は URL 生成の際に大規模に URL プリフィックスを置き換える ために使用することができます。 scheme, host, port 引数は request.application_url のそれぞれのデフォルト値を部分的に置き換える ために使用できます。
  • pyramid.request.Request.route_url() API は、これらの引数を 受け取るようになりました: _app_url, _scheme, _host, _port_app_url 引数は URL 生成の際に大規模に URL プリフィックスを置き換える ために使用することができます。 _scheme, _host, _port 引数は request.application_url のそれぞれのデフォルト値を部分的に置き換える ために使用できます。

後方非互換性

  • 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 の 最新のリリースを使用してください。

  • 利用できる scaffold の名前が変わりました。また、 pcreate がサポート するフラグは paster create のサポートするフラグとは異なります。 例えば pyramid_alchemy は単に alchemy になりました。
  • paster コマンドは、プロジェクトを作成したり、サーバーを始めたり、 デバッグコマンドを実行したりするための文書化された方法ではなくなりま した。 scaffold からプロジェクトを作成するのに、 paster createpcreate コンソールスクリプトに置き換えられます。プロジェクトを 実行するのに、 paster servepserve コンソールスクリプト に置き換えられます。 pshell, pviews, proutes, ptweens という名前の新しいコンソールスクリプトは、それらの paster <コマンド名> 等価物が行っていたことを行います。 関連する narrative documentation がすべて更新されました。根拠: Paste と PasteScript パッケージは Python 3 の下で動きません。
  • 新しく生成された scaffold で pserve を実行した場合、デフォルトの WSGI サーバーは paste.httpserver サーバーの代わりに waitress WSGI サーバーになりました。根拠: Paste と PasteScript パッケージは Python 3 の下で動きません。
  • pshell コマンド (“paster pshell” を参照) はコマンドライン引数 --disable-ipython を受け付けなくなりました。代わりに -p 引数または --python-shell 引数を受け付けます。その値は python, ipython or bpython のいずれかです。
  • pyramid.renderers.renderer_from_name 関数が削除されました。それは Pyramid 1.0 以降廃止されており、 API ではありませんでした。
  • Pyramid >= 1.3 バージョンと共に ZCML を使用するために、 pyramid_zcml バージョン >= 0.8 と zope.configuration バージョン >= 3.8.0 が必要です。 pyramid_zcml パッケージのバージョン 0.8 は Pyramid 1.0 までずっと後方互換性を持ちます。したがって、より古いバー ジョンをインストールしていて Pyramid 自体を “in-place” でアップグレード した場合、警告されません; その代わりに単に壊れるでしょう。 (特に ZCML の includeOverrides ディレクティブを使用している場合)
  • 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 クォートされ ません)

  • 非 ASCII 文字を含むバイト文字列をパターンとして pyramid.config.Configurator.add_route() に渡した場合、 スタートアップ時に失敗します。 Unicode を代わりに使用してください。
  • path_info ルートとビュー述語は、 request.path_info (Python 3 と Python 2 で不定の値) ではなく request.upath_info (Unicode) に対してマッチするようになりました。 Python 2 と Python 3 でマッチを 標準化するために、これを行わなければなりませんでした。
  • match_param ビュー述語は dict を受け付けなくなりました。 これによるネガティブな影響はないでしょう。 なぜなら dict ベースの引数に対する実装は壊れていたからです。
  • 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 警告が発生します。

  • pyramid.config.Configurator.with_context クラスメソッドが削除され ました。これは API ではなく、単に pyramid_zcml によって使用されて いました。また、その機能は pyramid_zcml パッケージの最新版に移動 されました。このことは、 Pyramid のこのリリースと共に pyramid_zcml のリリース 0.9.2 以降を使用する必要があるということを意味します。
  • 古い廃止された set_notfound_view Configurator メソッドは新しい add_notfound_view Configurator メソッドの別名になりました。同様に、 古い廃止された set_forbidden_view は新しい add_forbidden_view Configurator メソッドの別名になりました。これには次の影響があります: set_notfound_view または set_forbidden_view によって登録された (context, request) 呼び出し署名を持つビューに送られる context は、見つかった実際のリソースコンテキストではなく例外 オブジェクトになるでしょう。実際のリソースコンテキストを得るためには request.context を使用してください。さらに、エイリアスされていた としても、 set_notfound_view を使わずに add_notfound_view を 使うこと、 set_forbidden_view を使わずに add_forbidden_view を 使うことが推奨されます。

廃止

  • pyramid.view.append_slash_notfound_view および pyramid.view.AppendSlashNotFoundViewFactory の API ドキュメンテー ションが削除されました。これらの名前はまだ存在し、インポート可能ですが、 それらはもはや API ではありません。同じ振る舞いを得るために pyramid.config.Configurator.add_notfound_view(append_slash=True) あるいは pyramid.view.notfound_view_config(append_slash=True) を 使用してください。
  • Configurator の set_forbidden_viewset_notfound_view メソッド がドキュメンテーションから削除されました。それらは Pyramid 1.1 以降 廃止されていました。
  • tmpl_context リクエスト変数に対するすべての言及はドキュメントから 削除されました。 Pyramid におけるその存在は、 Pylons ユーザでなかった 人々を混乱させます。それは Pyramid 1.0 で Pylons ユーザの移行の利便性の ために追加されましたが、 Pyramid のレンダリングシステムは Pylons のものとは非常に異なっているため人気を得ませんでした。また、Pylons で実現しようとしていたことを行うための代替の方法が存在します。 この機能は「永久に」存在し続けるでしょうが、ドキュメントの中では推奨、 または言及されません。
  • Pyramid が提供するすべての .ini ファイルの中で、何もしない pyramid.debug_templates 設定への言及が削除されました。この設定は、 以前は Chameleon がよりよい例外をレンダリングするように指定するものでした; 現在 Chameleon はこの設定値にかかわらず常によい例外をレンダリングします。

既知の問題

  • この記述 (Pyramid 1.3b2 のリリース) の時点で、 Python 3.2 上で setup.py develop によって alchemy scaffold を使用した Pyramid プロジェクトをインストールしようとした場合、 Pygments を インストールする間にインストールエラーで中止します。これが起こる 場合、単に setup.py develop を再実行してください。そうすれば完全 に成功するでしょう。これは Pythoon 3 の下の SQLAlchemy 0.7.5 の中の マイナーなバグによるもので、新しい SQLAlchemy リリースで修正されるで しょう。 http://www.sqlalchemy.org/trac/ticket/2421 を注視していてく ださい。

ドキュメントの改善

  • narrative ドキュメントに Pyramid Configurator の拡張 という章が追加されました; それは、カスタム設定ディレクティブを加える方法とカスタムディレクティブ 内で pyramid.config.Configurator.action() メソッドを使う方法に ついて記述します。さらに、 introspectable なオブジェクトを加える 方法について記述します。
  • narrative ドキュメントに Pyramid Configuration Introspection という章が追加 されました。それは、 introspection システムに対して問い合わせる方法を 記述します。
  • API ドキュメントに pyramid.scaffolds のための章が追加されました。
  • Invoking a Requestprequest コマンドラインスクリプト の記述が追加されました。
  • “Running Pyramid on Google App Engine” チュートリアルが主要ドキュメント から除かれました。それはクックブックの中に残されています (http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/gae.html) 。 根拠: このドキュメントは GAE の Python 2.5 バージョンでのみ正しい情報を 提供します。そして Pyramid のこのバージョンは Python 2.5 をサポートしません。
  • Forbidden View の変更 節が更新されました。 add_view または view_config を使用してビューを登録する説明が add_forbidden_view または forbidden_view_config を使用する説明に 置き換えられました。
  • Not Found ビューの変更 節が更新されました。 add_view または view_config を使用してビューを登録する説明が add_notfound_view または notfound_view_config を使用する説明に 置き換えられました。
  • Redirecting to Slash-Appended Routes 節が更新されました。 add_view あるいは view_config を使用してビューを登録する説明が add_notfound_view または notfound_view_config を使用する説明に 置き換えられました。
  • すべてのチュートリアルが pyramid.view.view_config と HTTPForbidden コンテキストを使うのではなく pyramid.view.forbidden_view_config を使うように更新されました。

依存性の変更

  • Pyramid は、テストのための依存性を除いて zope.component パッケージに依存しなくなりました。
  • Pyramid は次のパッケージバージョンに依存するようになりました: Python 3 互換性の目的のために zope.interface>=3.8.0, WebOb>=1.2dev, repoze.lru>=0.4, zope.deprecation 3.5.0, translationstring 0.4 。 さらに、テスト依存性として、同じ理由で WebTest 1.3.1 に依存します。
  • Pyramid は Paste または PasteScript パッケージに依存しなく なりました。これらのパッケージは Python 3 互換ではありません。
  • スキャン ignore サポートを提供するため venusian >= 1.0a3 に依存し ています。

scaffold の変更

  • 生成された scaffold は、より再配置可能 (パッケージ中のファイル内でパッ ケージ名に言及する箇所が少数) になるように変更されました。
  • routesalchemy scaffold は alchemy と改名され、より古い (トラ バーサルに基づいた) alchemy scaffold を置き代えました (古い alchemy scaffold は引退しました)。
  • alchemystarter scaffold は Python 3 互換です。
  • starter scaffold は、デフォルトで URL ディスパッチを使用するよう になりました。