(機械翻訳) 既存の Pyramid アプリケーションの拡張¶
a:app: `Pyramid`開発者がアプリケーションを構築する際に一定の制約に従った場合、第三者はソースコードを変更することなくアプリケーションの動作を変更できるはずです。特定の制約に従うa:app: `Pyramid`アプリケーションの動作は、変更することなく*オーバーライド*または*拡張*することができます。
私たちは、このような努力に関与する当事者を特定するために、いくつかの専門用語をここで定義します。
- 開発者
- 元のアプリケーション開発者。
- 積分器
- 元のアプリケーション開発者が作成したアプリケーションを予期せぬ状況で再利用したい別の開発者。元のアプリケーションのソースコードを変更せずに元のアプリケーションを変更したい場合もあります。
"Extensible "と"Pluggable "アプリケーションの違い¶
次のような他のWebフレームワーク:term: `Django`は、開発者が"プラグ可能なアプリケーション"を作成できるようにすることを宣伝します。彼らは、特定の方法でアプリケーションを作成すると、サードパーティの開発者が作成した任意の方法で作成された別のアプリケーションやプロジェクトに、合理的で構造化された方法で統合できると主張しています。
:app: `Pyramid`はプラットフォームとして、そのような機能を提供すると主張していません。プラットフォームは、任意のインテグレータが大きなピラミッドアプリケーションまたはプロジェクトのサブコンポーネントとしてアプリケーションを使用できるように、アプリケーションを作成してパッケージ化できる保証はありません。ピラミッドは、このようなパターンがうまく機能するために必要な制約を強制しません。 Pyramidはあまり「有名人」ではないので、開発者はアプリケーションを構築するために大きく異なるパターンや技術を使用することができます。特定の第三者のインテグレータは、特定のピラミッドアプリケーションを再利用できるようになる可能性があります。インテグレータと元の開発者は、特定のリレーショナルデータベースやORMのような基本テクノロジの選択肢を共有する可能性があるからです。しかし、同じアプリケーションは、元の開発者とは互換性のない異なる技術選択肢を作成したため、異なる開発者が再利用することはできません。
その結果、"プラグイン可能なアプリケーション"の概念は"CMS "レイヤーまたは"アプリケーションサーバー"レイヤーのようなPyramidの上に構築されたレイヤーに残されます。このような層は、(特定のURLが特定のビットのビットにマッピングされることを記録する、記憶層、テンプレートシステム、構造化された、十分に文書化されたパターンを強制するなどの)必要な「意見」を提供する傾向があります。 "プラグ可能なアプリケーション"が可能です。 "Pluggable applications "はPyramid自体にプラグインするのではなく、Pyramidの上に書かれたシステムにプラグインする必要があります。
"プラグイン可能なアプリケーション"は提供していませんが、Pyramid は単一の既存アプリケーションの拡張を可能にする豊富なメカニズムを提供します。このような機能は、Pyramidをベースに構築されたフレームワークで使用できます。すべてのPyramidアプリケーションはプラグ可能*ではないかもしれませんが、すべてのPyramidアプリケーションは*拡張可能です。
拡張可能なアプリケーションを構築するためのルール¶
app: Pyramid`アプリケーション:開発者は、あなたが作成したオーバーライド可能な:term:`必須の設定 'をファンクションに因数分解する必要があります。あなたのアプリケーションの ` __init __。py``の `` main``関数内で:term: Configurator`のメソッドへの呼び出しとしてインラインではなく、:meth: pyramid.config.Configurator.include`を介して使用されます。たとえば、以下のようになります。
1 2 3 4 5 6 | from pyramid.config import Configurator
if __name__ == '__main__':
config = Configurator()
config.add_view('myapp.views.view1', name='view1')
config.add_view('myapp.views.view2', name='view2')
|
呼び出しを(再利用不可能な) `` if __name__ == '__main __' ``ブロックの外で、再利用可能な関数の外に移動する必要があります:
1 2 3 4 5 6 7 8 9 | from pyramid.config import Configurator
if __name__ == '__main__':
config = Configurator()
config.include(add_views)
def add_views(config):
config.add_view('myapp.views.view1', name='view1')
config.add_view('myapp.views.view2', name='view2')
|
これにより、インテグレータは、アプリケーションに関連する構成文を最大限に再利用することができます。これにより、「上書きパッケージ」から作成した構成機能を選択的に含めるか除外することができます。
代わりに、設定を拡張したり上書きできるようにするために:term: `ZCML`を使用することもできます。 :term:アプリケーションに属する `ZCML`宣言は、必要に応じて同様の方法でオーバーライドし、インテグレータによって拡張することができます。 :term: `ZCML`だけを使ってアプリケーションを設定すると、手動で手を加えることなく自動的に最大限の拡張が可能になります。 ZCMLの使い方についてはterm: `pyramid_zcml`を参照してください。
基本的なプラグポイント¶
:app: Pyramid`を使って開発されたアプリケーションの基本的な"プラグポイント "は* routes *、* views *、* assets *です。ルートは:meth: `pyramid.config.Configurator.add_route`メソッドを使って宣言されています。ビューは、:meth: `pyramid.config.Configurator.add_view`メソッドを使用して宣言されます。アセットは:term: `asset specification`を介して静的ファイルやテンプレートのような:term: pkg_resources` APIを使って:app: Pyramid`によってアクセスされるファイルです。他のディレクティブおよびコンフィグレータメソッドもルート、ビュー、およびアセットを処理します。たとえば、 ` pyramid_handlers``パッケージの `` add_handler``ディレクティブは、単一のルートといくつかのビュー数を追加します。
既存のアプリケーションの拡張¶
既存のアプリケーションを拡張する手順は、アプリケーションが構成デコレータを使用するかどうか、または必須コードを使用するかどうかによって大きく異なります。
アプリケーションに構成デコレーションがある場合¶
あなたは:class: pyramid.view.view_config`デコレータや他の:term: configuration decoration`デコレータを使って拡張またはオーバーライドしたいa:app: `Pyramid`アプリケーションを継承しました。
アプリケーションを*拡張する*だけの場合は、アプリケーションのパッケージに対して:term: `scan`を実行して、より多くのビューやルートを登録する追加の設定を追加します。
1 2 3 | if __name__ == '__main__':
config.scan('someotherpackage')
config.add_view('mypackage.views.myview', name='myview')
|
アプリケーションで設定を上書きする場合は、元のパッケージのスキャンを実行した後に:meth: `pyramid.config.Configurator.commit`を実行し、さらにビューまたはルートを登録する追加の設定を追加する必要がありますオーバーライドを実行します。
1 2 3 4 | if __name__ == '__main__':
config.scan('someotherpackage')
config.commit()
config.add_view('mypackage.views.myview', name='myview')
|
これが完了したら、他のアプリケーションのようにアプリケーションを拡張または上書きできなければなりません(:ref: `extend_the_application`を参照)。
代わりに、:term: scan`が:meth: pyramid.config.Configurator.scan`メソッドへの呼び出しを省略することによって起こるのを防ぐこともできます。これにより、ターゲットアプリケーション内のオブジェクトにアタッチされたデコレータは何もしなくなります。この時点で、デコレータで行われたすべての設定を同等の必須設定またはZCMLに変換し、その設定またはZCMLを:ref: `extend_the_application`で説明されている別のPythonパッケージに追加する必要があります。
アプリケーションの拡張¶
既存のアプリケーションの動作を拡張またはオーバーライドするには、古いパッケージのコンフィグレーションを含む新しいパッケージを作成する必要があります。オーバーライドするタイプの実装を作成する必要があります(ビューとして)、元のパッケージ内で参照されます。
既存のアプリケーションを拡張するための一般的なパターンは、次のようになります。
- 新しいPythonパッケージを作成します。これを行う最も簡単な方法は、:term: cookiecutter`を使って、新しい:app: Pyramid`アプリケーションを作成することです。詳細は、ref: `creation_a_project`を参照してください。
- 新しいパッケージでは、ビューや必要に応じてテンプレートや静的アセットなどのオーバーライドされた要素を含むPythonファイルを作成します。
- 新しいパッケージを元のアプリケーションと同じPython環境にインストールします( `` $ VENV / bin / pip install -e .``や `` $ VENV / bin / pip install``など)。
- 新しいパッケージの `` __init __。py``の `` main``関数を、:meth: pyramid.config.Configurator.include`文またはa:termを使って元の:app: Pyramid`アプリケーションの設定関数を含めるように変更してください: スキャン。
- 新しいパッケージの新しいビューとアセットを、新しいアプリケーションの `` __init __。py``ファイルの `` main``関数内での必須登録を使って配線します。この配線は、古いアプリケーションの設定機能を含めて* *後に実行する必要があります。これらの登録は、元のアプリケーションによって行われた登録を延長または上書きします。参照:ref: overriding_views、:ref:` overriding_routes`、および:ref: `overriding_resources`を参照してください。
ビューのオーバーライド¶
:term: view configuration`宣言は、アプリケーションの振る舞いをオーバーライドするのに通常は同じです:term: view predicate`属性をオーバーライドしたい元のものと同じにします。これらの " <view> ``宣言はあなたが作成したオーバーライドパッケージの"新しい"ビューコードを指します。新しいビューコード自体は、通常、元のアプリケーションからのビュー呼び出し可能なコピーとコピーのコピーをわずかに変更したものです。
たとえば、元のアプリケーションに以下の `` configure_views``設定メソッドがある場合、
1 2 | def configure_views(config):
config.add_view('theoriginalapp.views.theview', name='theview')
|
元のコンフィギュレーション関数をロードした後で、オーバーライドパッケージ内の `` configure_views``によって行われた最初のビュー設定ステートメントをオーバーライドすることができます:
1 2 3 4 5 6 7 | from pyramid.config import Configurator
from originalapp import configure_views
if __name == '__main__':
config = Configurator()
config.include(configure_views)
config.add_view('theoverrideapp.views.theview', name='theview')
|
この場合、 `` theoriginalapp.views.theview``ビューは決して実行されません。代わりに、新しいビュー `` theoverrideapp.views.theview``は、リクエスト状況が指示されたときに実行されます。
同様のパターンを使用して、アプリケーションを `` add_view``宣言で拡張することができます。他のいくつかの述語セットに対して新しいビューを登録して、それが意味するURLが他のページレンダリングで利用可能であることを確認してください。
ルートのオーバーライド¶
ルート設定は現在、通常は:meth: 〜pyramid.config.Configurator.add_route`への順序付き呼び出しのシーケンスで実行されます。これらの呼び出しは互いに順序付けされているため、この順序付けは通常重要なので、オーバーライドを実行するときには相対順序を保持する必要があります。通常は、すべての ` add_route``文をオーバーライドパッケージのファイルにコピーし、必要に応じて変更します。次に、元のアプリケーションから `` add_route``文を除外します。
アセットのオーバーライド¶
アセットは、Python *パッケージ内でアクセス可能なファイルシステム上のファイルです。章全体は資産::ref: assets_chapter`に充てられます。この章では、ref: `overriding_assets_section`という名前のセクションがあります。この章のこのセクションでは、:meth: `pyramid.config.Configurator.override_asset`メソッドを使用して、パッケージアセットを他のアセットでオーバーライドする方法について詳しく説明します。オーバーライドを実行するためにオーバーライドパッケージの ` __init __。py``にそのような `` override_asset``呼び出しを追加してください。