(機械翻訳) 静的資産¶
An:term: asset`は、PythonソースコードファイルではないPython:term: package`に含まれるファイルです。たとえば、以下はそれぞれ資産です。
- Pythonパッケージに含まれるGIF画像ファイル、またはPythonパッケージのサブディレクトリに含まれるGIF画像ファイル。
- Pythonパッケージに含まれるCSSファイル、またはPythonパッケージのサブディレクトリに含まれるCSSファイル。
- Pythonパッケージに含まれるか、Pythonパッケージのサブディレクトリに含まれるJavaScriptソースファイル。
- それが `` __init __。py``を持たないパッケージ内のディレクトリ(パッケージである `` __init __。py``を持っている場合)です。
- a:term: Chameleon`または:term: Mako`テンプレートファイル(Pythonパッケージに含まれています)。
ほとんどのWeb開発プロジェクトでは、資産の使用が非常に一般的です。たとえば、:ref: creating_a_project`で説明されているように、:app: Pyramid`アプリケーションを利用可能なterm: cookiecutter sで作成すると、アプリケーションを表すディレクトリにPython:term: パッケージ。そのPythonパッケージ内には、静的資産であるファイルがいっぱいのディレクトリがあります。たとえば、 `` .css``、 `` .js``、および .gif``ファイルを含む 静的 `ディレクトリがあります。これらのアセットファイルは、ユーザーがアプリケーションURLにアクセスしたときに配信されます。
資産の仕様の理解¶
:func: pyramid.renderers.render_to_response APIを使って:term:` Chameleon` ZPTテンプレートを使用する:app: Pyramid`アプリケーションを作成したとします。例えば、アプリケーションは ` myapp``パッケージ内の `` views.py``ファイル内でそのAPIを使用して:term: asset specification` `myapp:templates / some_template.pt``を使ってアセットにアクセスするかもしれません:
1 2 | from pyramid.renderers import render_to_response
render_to_response('myapp:templates/some_template.pt', {}, request)
|
"Under the hood "、このAPIが呼び出されると、:app: Pyramid`は、開発者によって提供された文字列 `myapp:templates / some_template.pt`の意味を理解しようとします。この文字列は:term: `asset specification`です。これは2つの部分で構成されています。
- *パッケージ名*( `` myapp``)
- パッケージディレクトリに対する*アセット名*( `` templates / some_template.pt``)。
:app: Pyramid`は、Python:term: pkg_resources` APIを使用して、パッケージ名とアセット名を絶対(オペレーティングシステム固有の)ファイル名に解決します。最終的には解決されたこの絶対ファイルシステムパスをChameleonテンプレートエンジンに渡し、テンプレートエンジンを使用してテンプレートファイルの読み込み、解析、実行を行います。
第二の形式の資産指定:相対*資産指定があります。特定の状況では、パッケージ名を含むアセット指定を"絶対"の代わりに指定から省略することができます。たとえば、 `` myapp:templates / some_template.pt``の代わりに `` templates / mytemplate.pt``を使うことができます。このような資産の仕様は、通常、現在のパッケージとの相対的なものです。 "現在のパッケージ"は通常、資産仕様を使用するコードを含むパッケージです。 :app:ピラミッドAPIは、相対資産仕様を受け入れるもので、一般的に、個々の文書でその資産が相対的なものであることを表します。
静的資産の提供¶
:app: Pyramid`は、ファイルシステム上のディレクトリから静的アセットファイルをアプリケーションユーザのブラウザに提供することを可能にします。 :meth: `pyramid.config.Configurator.add_static_view`を使って、app: Pyramid`にJavaScriptやCSSファイルなどの静的アセットを提供するよう指示します。このメカニズムは静的ファイルのディレクトリをアプリケーションのルートURLに関連する名前、例えば `` / static``や外部URLとして利用可能にします。
注釈
:meth: 〜pyramid.config.Configurator.add_static_view`は1つのファイルを提供することはできませんし、a:app: Pyramid`アプリケーションのルートURLに対して直接静的ファイルのディレクトリを提供することもできません。これらの機能については、:ref: `advanced_static`を参照してください。
以下は、:meth: 〜pyramid.config.Configurator.add_static_view`の使用例です。これは:app: Pyramid`を実行するコンピュータの `` / var / www / static``ディレクトリからファイルを提供します。アプリケーションを `` / static`` URL接頭辞の下にURLとして追加します。
1 2 | # config is an instance of pyramid.config.Configurator
config.add_static_view(name='static', path='/var/www/static')
|
`` name``はURL *プレフィックス*を表します。 `` path``ディレクトリにあるファイルが提供されるためには、それらのうちの1つを要求するURLがその接頭辞で始まらなければなりません。上記の例では、 `` name``は 静的 ``で、 `` path``は `` / var / www / static``です。英語では、 `` / var / www / static``にあるファイルを `` / static
URL接頭辞のサブURLとして提供したいと考えています。したがって、ユーザーがあなたのアプリケーションのURL「/ static / foo.css」を訪れたときに、ファイル `` / var / www / static / foo.css``が返されます。
`` path``で指定された静的ディレクトリには、サブディレクトリが再帰的に含まれることがあります。また、サブディレクトリにはファイルが保存されます。これらは静的ビューによって解決されます。特定のファイルタイプごとに静的ビューから返される `` Content-Type``ヘッダーは、そのファイル拡張子に依存します。
デフォルトでは、:meth: 〜pyramid.config.Configurator.add_static_view`で利用できるすべてのファイルは完全に匿名のユーザーがアクセスできます。ただし、単純な承認が必要な場合があります。パーミッションを使って静的ファイルのセットを保護するには、必要な ` name``と `` path``引数を渡すだけでなく、 `` permission``キーワード引数を:meth: 〜pyramid.configに渡します。 Configurator.add_static_view。 `` permission``引数の値は、静的ビューが呼び出されたときにユーザがcurrent:term: context`を基準にして持っていなければならない:term: permission`を表します。ユーザは静的ビューの `` path``で表されるファイルを見るためにこの許可を持っている必要があります。静的資産をより複雑な認可スキームで保護する必要がある場合は、:ref: `advanced_static`を参照してください。
`` path``引数として絶対パスの代わりに:term: asset specification`を使用する別の例を次に示します。確かめるには:meth: `〜pyramid.config.Configurator.add_static_view`は、 some_packageというPythonパッケージの a / b / c / static``ディレクトリから / static` URLの下にファイルを提供する``、 `` path``として完全修飾:項:資産指定を使うことができます:
1 2 | # config is an instance of pyramid.config.Configurator
config.add_static_view(name='static', path='some_package:a/b/c/static')
|
:meth: `〜pyramid.config.Configurator.add_static_view`は、完全修飾語:用語:資産指定または*絶対パス*とすることができます。
URL接頭辞を表す代わりに、:meth: 〜pyramid.config.Configurator.add_static_view`の呼び出しの name``引数は、代わりに* URL *にすることができます。これまでに見てきたそれぞれの例では、URL接頭辞として "name"引数を使用しています。ただし、 ` name``が* URL *の場合、静的アセットは外部Webサーバーから提供されます。このモードでは、:meth: pyramid.request.Request.static_url`を使用してURLを生成するときに、 `name``がURLプレフィックスとして使用されます。
たとえば、:meth: 〜pyramid.config.Configurator.add_static_view`は、 http:// example.com / images``という名前の `name``引数を与えられます:
1 2 3 | # config is an instance of pyramid.config.Configurator
config.add_static_view(name='http://example.com/images',
path='mypackage:images')
|
:meth: 〜pyramid.config.Configurator.add_static_view`は http:// example.com / images``のURLである name``引数で提供され、それ以降の:meth:〜 pyramid.request.Request.static_url`に渡された `` path``引数で始まるパス:meth: 〜pyramid.config.Configurator.add_static_view`は、 http://example.com 'のようなURLを生成します/ images / logo.png`。 `` example.com``をリッスンしている外部Webサーバーは、そのような要求に適切に応答するように構成されていなければなりません。 :meth: 〜pyramid.request.Request.static_url APIについては、この章の後半で詳しく説明します。
静的資産URLの生成¶
静的アセットディレクトリを登録するために:meth: 〜pyramid.config.Configurator.add_static_view`メソッドが使用された場合、適切なURLを生成するために:meth: pyramid.request.Request.static_url`という名前の特殊ヘルパーAPIを使用できます静的登録 `` path``属性によって指定されたディレクトリの1つに存在するアセットのためのものです。
たとえば、次のような静的宣言のセットを作成するとします。
1 2 | config.add_static_view(name='static1', path='mypackage:assets/1')
config.add_static_view(name='static2', path='mypackage:assets/2')
|
これらの宣言は、それぞれが `` / static1``と `` / static2``で始まるURLを持つURLアクセス可能なディレクトリを作成します。ユーザーが `` / static1``で始まるURLを訪問し、 `` assets / 2``の資産を参照すると、 `` mypackage``パッケージの `` assets / 1``ディレクトリにある資産が参照されますユーザが `` / static2``で始まるURLにアクセスすると、 `` mypackage``パッケージのディレクトリが参照されます。
このような構成では、静的アセットへのURLを手作業で生成する必要はありません。代わりに、:meth: 〜pyramid.request.Request.static_url APIを使用してそれらを生成してください。例えば:
1 2 3 4 5 6 7 8 | from pyramid.renderers import render_to_response
def my_view(request):
css_url = request.static_url('mypackage:assets/1/foo.css')
js_url = request.static_url('mypackage:assets/2/foo.js')
return render_to_response('templates/my_template.pt',
dict(css_url=css_url, js_url=js_url),
request=request)
|
実行中のシステムのリクエスト "アプリケーションURL"が "http:// example.com"の場合、上記で生成された "css_url"は次のようになります: "http://example.com/static1/foo .css``。上記で生成された `` js_url``は `` http:// example.com / static2 / foo.js``です。
静的URLを手作業で構築するのではなく、:meth: 〜pyramid.request.Request.static_url`関数を使う利点の1つは、静的URL宣言の `name``を変更する必要がある場合、生成されたURLは名前の変更後も引き続き適切に解決されます。
URL::meth: 〜pyramid.request.Request.static_url`を使って:app: Pyramid`アプリケーションの外部にある静的アセットにURLを生成することもできます。これは、:meth: 〜pyramid.config.Configurator.add_static_view APIが、:meth:〜pyramid.request.Request.static_url`に与えられたパスに関連付けられ、ビュー名の代わりに* URL *である場合に発生します。たとえば、 ` name``引数は `` http:// example.com``であり、 `` path``は `` mypackage:images``:
1 2 | config.add_static_view(name='http://example.com/images',
path='mypackage:images')
|
このような設定では、 `` mypackage:images``で始まるアセットの `` static_url``で生成されるURLの先頭に `` http:// example.com / images``という接頭辞が付きます:
1 2 | request.static_url('mypackage:images/logo.png')
# -> http://example.com/images/logo.png
|
:meth: 〜pyramid.request.Request.static_url`を:meth:〜pyramid.config.Configurator.add_static_view`と組み合わせて使用すると、制作中に別のウェブサーバーに静的メディアを置くことができます( ``名前開発中に開発中のWebサーバが静的メディアを内部的に保持しておきながら(meth: 〜pyramid.config.Configurator.add_static_view`はURLです)、 meth: ` `〜pyramid.config.Configurator.add_static_view`はURLプレフィックスです)。
たとえば、:ref: `カスタム設定を定義することができます<adding_a_custom_setting>私たちの資産がCDN上でホストされているときに、本番環境の外部URLに設定できる `media_location`という名前です。
1 2 3 4 | media_location = settings.get('media_location', 'static')
config = Configurator(settings=settings)
config.add_static_view(path='myapp:static', name=media_location)
|
これで設定をiniファイルに定義することができます:
1 2 3 4 5 | # production.ini
[app:main]
use = egg:myapp#main
media_location = http://static.example.com/
|
また、ファイルシステム上の絶対パスを参照することで、ソース外にある資産を提供することもできます。これを達成するには2つの方法があります。
まず、:meth: `〜pyramid.config.Configurator.add_static_view`はアセット仕様の代わりに絶対パスを直接取ることをサポートしています。これは期待どおりに動作し、ファイルやファイルのフォルダを探し、アプリケーション内のあるURLや外部から提供します。残念ながら、このテクニックには、アセット仕様に基づいて動作するため、:meth: `〜pyramid.request.Request.static_url`メソッドを使用してURLを生成することができないという欠点があります。
バージョン 1.6 で追加.
Pyramid 1.6以降で利用可能な2番目のアプローチは、:ref: `overriding_assets_section`セクションで説明されているアセットオーバーライドAPIを使用しています。 "ダミー"パッケージを構成して、そのファイルまたはフォルダを絶対パスから提供することは可能です。
config.add_static_view(path='myapp:static_images', name='static')
config.override_asset(to_override='myapp:static_images/',
override_with='/abs/path/to/images/')
この設定から、 `` request.static_url( 'myapp:static_images / foo.png'のようなことをして、フォルダ内のデータへのURLを生成するために:meth: 〜pyramid.request.Request.static_url`を使うことが可能になりました。 ) `。 `` static_images``ファイルまたはフォルダが実際に `` myapp``パッケージに存在する必要はありませんが、 `` myapp``部分が有効なパッケージを指していることが重要です。フォルダーが存在する場合は、ファイルの名前が両方の場所に存在する場合は、オーバーライドされたフォルダーに優先順位が与えられます。
キャッシュバスト¶
バージョン 1.6 で追加.
Webアプリケーションのパフォーマンスを最大限にするには、一般に、特定のクライアントが同じ静的資産を要求する回数を制限する必要があります。理想的には、クライアントは特定の静的資産を永久にキャッシュし、クライアントに一度だけ送信する必要があります。 HTTPプロトコルを使用すると、特定のアセットを一定時間キャッシュするようにクライアントに指示できるHTTPレスポンスでヘッダーを送信できます。クライアントがキャッシュ内にアセットのコピーを持ち、そのキャッシュの有効期限が切れていない限り、クライアントはサーバーから新しいコピーを要求するのではなく、キャッシュされたコピーを使用します。静的アセットのクライアントへのキャッシュヘッダーの送信の欠点は、ある時点で静的アセットが変更される可能性があることです。クライアントはアセットの新しいコピーをロードする必要があります。通常の状況下では、クライアントのキャッシュされたコピーが期限切れになるのを待ってから、新しいバージョンの静的リソースを取得する必要があります。
この問題の一般的な回避策は、term: `cache busting`と呼ばれる手法です。キャッシュ無効化方式には、通常、静的資産が変更されたときに変更される静的資産のURLを生成することが含まれます。このようにして、クライアントに静的アセットを送信して、クライアントにアセットを非常に長時間キャッシュするように指示することができます。静的アセットが変更されると、Webページでそれを参照するために使用されるURLも変更されるため、クライアントは新しいリソースとして認識し、リソースの古いURLに設定されたキャッシュポリシーに関係なくアセットを要求します。
:app: Pyramid`は、以下を使って静的アセットのキャッシュ破棄URLを生成するように設定できます:meth:〜pyramid.config.Configurator.add_cache_buster`:
1 2 3 4 5 6 7 8 | import time
from pyramid.static import QueryStringConstantCacheBuster
# config is an instance of pyramid.config.Configurator
config.add_static_view(name='static', path='mypackage:folder/static/')
config.add_cache_buster(
'mypackage:folder/static/',
QueryStringConstantCacheBuster(str(int(time.time()))))
|
キャッシュバスターを追加すると:app: `Pyramid`は、資産のURLのクエリ文字列に静的アセットの現在の時刻を追加します:
1 2 | js_url = request.static_url('mypackage:folder/static/js/myapp.js')
# Returns: 'http://www.example.com/static/js/myapp.js?x=1445318121'
|
Webサーバーが再起動すると、時定数が変更されるため、URLも変更されます。
注釈
キャッシュ・バスト処理は、資産パイプラインとWebアプリケーションを統合するため、本質的に複雑なトピックです。アプリケーション作成者は、独自のアセットパイプラインのプロパティに準拠した独自のキャッシュバスター実装を作成することが期待され、望まれています。独自の記述については、ref: `custom_cache_busters`を参照してください。
キャッシュ・バスターの無効化¶
:meth: 〜pyramid.config.Configurator.add_cache_buster`への呼び出しを変更することなく、設定されたすべてのキャッシュバスターをグローバルに無効にすることができます(開発など)。これを行うには、 ` PYRAMID_PREVENT_CACHEBUST``環境変数か `` pyramid.prevent_cachebust``設定値を真の値に設定します。
キャッシュ・バスターのカスタマイズ¶
:meth: 〜pyramid.config.Configurator.add_cache_buster`を呼び出すと、class:〜pyramid.interfaces.ICacheBuster`というインターフェースを実装するオブジェクトを使用できます。
:app: Pyramid`は非常に単純化されています:class:〜pyramid.static.QueryStringConstantCacheBuster`:アセットのURLのクエリ文字列にあなたが提供する任意のトークンを追加します。これは、個々の資産をきめ細かく破棄することができないため、プロダクションではほとんど望みません。
独自のキャッシュ・バスターを実装するために、:class: 〜pyramid.interfaces.ICacheBuster`インターフェースを実装して独自のクラスを一から書くことができます。あるいは、既存の実装の1つをサブクラス化することもできます。最も可能性の高いシナリオの1つは、資産トークンの生成方法を変更することです。これを行うにはclass: `〜pyramid.static.QueryStringCacheBuster`をサブクラス化し、 tokenize(pathspec) `メソッドを定義してください。 Gitを使って現在のコミットのハッシュを取得する例を以下に示します:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import os
import subprocess
from pyramid.static import QueryStringCacheBuster
class GitCacheBuster(QueryStringCacheBuster):
"""
Assuming your code is installed as a Git checkout, as opposed to an egg
from an egg repository like PYPI, you can use this cachebuster to get
the current commit's SHA1 to use as the cache bust token.
"""
def __init__(self, param='x', repo_path=None):
super(GitCacheBuster, self).__init__(param=param)
if repo_path is None:
repo_path = os.path.dirname(os.path.abspath(__file__))
self.sha1 = subprocess.check_output(
['git', 'rev-parse', 'HEAD'],
cwd=repo_path).strip()
def tokenize(self, pathspec):
return self.sha1
|
パスセグメントを変更する簡単なキャッシュバスターも構築できます。
1 2 3 4 5 6 7 8 9 10 | import posixpath
class PathConstantCacheBuster(object):
def __init__(self, token):
self.token = token
def __call__(self, request, subpath, kw):
base_subpath, ext = posixpath.splitext(subpath)
new_subpath = base_subpath + self.token + ext
return new_subpath, kw
|
このアプローチの注意点は、パスセグメントを変更するとファイル名が変更されるため、実際にファイルシステムにあるものと一致して、ファイルを見つけるために:meth: `〜pyramid.config.Configurator.add_static_view`が必要であるということです。次のセクションで説明するように、これらの状況には:class: `〜pyramid.static.ManifestCacheBuster`を使用する方が良いでしょう。
パスセグメントとキャッシュバスターの選択¶
多くのキャッシュHTTPプロキシは、URLにクエリ文字列が含まれている場合、リソースをキャッシュできません。したがって、一般に、トークンをクエリ文字列に追加する方法ではなく、パスセグメントを変更するキャッシュ破棄戦略を使用することをお勧めします。
:app: `Pyramid`アプリケーションがあなたの静的資産を提供するかどうか、css / javascript内部の書き換えURLを処理するために外部の資産パイプラインを使用しているかどうか、キャッシュをどのように細かくしたいかを検討する必要がありますトークンを破る。
多くの場合、静的資産を別のWebサーバーまたはCDNの外部にホストする必要があります。これらの場合、your:app: `Pyramid`アプリケーションは静的資産のコピーにアクセスすることさえできないことがあります。これらの資産をバストにキャッシュするには、それらに関するいくつかの情報が必要です。
静的ファイルを生成するために外部アセットパイプラインを使用する場合は、:class: `〜pyramid.static.ManifestCacheBuster`を使用することを検討する必要があります。このキャッシュ・バスターは、パイプラインによって生成された標準JSON形式のファイルをロードし、それを使用してアセットをバッシュ・キャッシュすることができます。 app: `Pyramid`は、キャッシュ破棄トークンを生成するためにファイルを見る必要はありませんが、ファイル単位の細かいトークンをサポートしています。
例えば、 `` manifest.json``のような例を考えます:
{
"css/main.css": "css/main-678b7c80.css",
"images/background.png": "images/background-a8169106.png"
}
次のコードはキャッシュバスターを設定します:
1 2 3 4 5 6 7 8 9 | from pyramid.static import ManifestCacheBuster
config.add_static_view(
name='http://mycdn.example.com/',
path='mypackage:static')
config.add_cache_buster(
'mypackage:static/',
ManifestCacheBuster('myapp:static/manifest.json'))
|
キャッシュバスターは、静的アセットのキャッシュで破棄されたURLの生成のみを処理することに注意することが重要です。これらの資産を提供するためのソリューションは提供していません**。たとえば、 `` css / main-678b7c80.css``のURLを生成した場合、そのURLはファイルの場所を指すように `` add_static_view``を適切に設定するか、あなたのCDN上に存在するファイル、または着信URLを書き換えてキャッシュバストトークンを削除します。
CSSとJavaScriptのソースとキャッシュの破棄¶
多くの場合、CSSやJavaScriptファイル内のイメージやその他の静的なアセットを参照する必要があります。キャッシュ無効化が有効な場合、最終的な静的アセットURLは、静的アセットがアセンブルされるまで使用できません。これらのURLは手書きできません。以下は、キャッシュバスターをスタック全体に統合する方法の例です。これは単なる例であり、特定のツールに合わせて修正する必要があることを覚えておいてください。
- 最初に、URLを最終的なキャッシュ・バスト・フォームに書き換えるプリコンパイラを使用してファイルを処理します。次に、:class: 〜pyramid.static.ManifestCacheBuster`を使用してアセットパイプラインを:app: Pyramid`と同期させることができます。パイプラインはアセットの最終URLを完全に制御できます。
これで、:app: `Pyramid`内で静的URLを生成できるようになったので、あなたがコントロールできないURLを処理する必要があります。これを行うには、以下のオプションのいくつかを使用して開始してください。
- アセットパイプラインを設定して、CSSおよびJavaScriptでURL参照をインラインで書き直すようにします。これは、ファイルをapp: `Pyramid`または外部のCDNで変更することなくホストすることができるため、最良の方法です。彼らは本当に静的です。
- JSとCSSをTemplatizeし、テンプレートコードの中で `` request.static_url() ``を呼び出します。このアプローチは特定のシナリオではうまくいくかもしれませんが、静的資産は実際には静的ではなく、app: `Pyramid`が正しく提供されるため、推奨されません。このアプローチの詳細については:ref: `advanced_static`を参照してください。
CSSおよびJavaScriptアセットでURLを使用して他のアセットを参照する場合、生成された静的ファイルをキャッシュ破棄トークンを含む新しいURLに書き換えることができる外部アセットパイプラインを実装することをお勧めします。内部の機械:app: `Pyramid`は、アプリケーションが使用する資産の種類についての知識がほとんどないため、このステップを助けません。 :app: `Pyramid`への統合は、単にそれらのアセットをHTMLや他の動的コンテンツにリンクするためだけです。
上級者:ビューコールバックを使用した静的資産の処理¶
柔軟性を高めるために、静的資産は:term: `view callable`によって提供され、手動で登録します。たとえば、:term: `URL dispatch`を使用している場合、以前のルートが一致しない場合にのみ静的資産をフォールバックとして使用できるようにすることができます。あるいは、ダウンロードに認証が必要なため、特定の静的資産を手動で提供することもできます。
:meth: 〜pyramid.request.Request.static_url APIを使用して、カスタム静的ビューを登録してアクセス可能にしたアセットに対するURLを生成することはできません。
ルート関連のカスタムスタティックビュー(URLディスパッチのみ)¶
:class: `pyramid.static.static_view`ヘルパークラスは、呼び出し可能なピラミッドビューを生成します。このビュー呼び出し可能は、ディレクトリから静的資産を提供することができます。このクラスのインスタンスは:meth: `〜pyramid.config.Configurator.add_static_view`設定メソッドによって実際に使用されるため、設定された動作はほぼ同じになります。
警告
次の例では、term: traversal`を使用するアプリケーションで*動作しません。 term: `URL dispatch`を排他的に使用すると動作します。登録するルート相対ルートは、トラバーサルが発生する前に常に一致し、 ` add_view``(少なくとも `` route_name``がないもの)によって登録されたビューを覆します。 A:class: 〜pyramid.static.static_view`静的ビューは:term: Not Found View`として登録されていない限り、トラバーサルを使用するとroot相対にすることはできません。
ルーティングテーブルの最後にあるルートからハングする"catchall "ルートの結果として、ファイルシステム上にあるディレクトリ内のファイルを `` / path / to / static / dir``に提供するには、あなたのアプリケーションルートの `` static.py``ファイルの中で:class: `〜pyramid.static.static_view`クラスのインスタンスを作成します。
1 2 | from pyramid.static import static_view
static_view = static_view('/path/to/static/dir', use_subpath=True)
|
注釈
クロスシステムの柔軟性を高めるために、物理的な絶対ファイルシステムパスの代わりに:class: 〜pyramid.static.static_view`の引数として:term: asset specification`を使用してください。たとえば、 `` mypackage:static``の代わりに`` / path / to / mypackage / static``のようなものです。
その後、このビューで提供されるファイルを `` / <filename> ``あなたのアプリケーションのスタートアップコードで設定メソッドを使います。
1 2 3 4 5 | # .. every other add_route declaration should come
# before this one, as it will, by default, catch all requests
config.add_route('catchall_static', '/*subpath')
config.add_view('myapp.static.static_view', route_name='catchall_static')
|
上の特別な名前 `` * subpath``は:class: `〜pyramid.static.static_view`ビューによって呼び出され、あなたが提供しているディレクトリを基準にファイルのパスを指定します。
"スタティック"アセットを表示するためのビュー呼び出し可能の登録¶
単一の静的資産を提供するために呼び出し可能な単純ビューを登録することができます。そうするには、手で"手で行います。まず、呼び出し可能なビューを定義します。
1 2 3 4 5 6 7 | import os
from pyramid.response import FileResponse
def favicon_view(request):
here = os.path.dirname(__file__)
icon = os.path.join(here, 'static', 'favicon.ico')
return FileResponse(icon, request=request)
|
`` favicon_view``内の上記のコードは"here "を計算します。これは関数が定義されているPythonファイルを基準とした相対パスです。次に、レスポンスの `` path``引数としてファイルパスを使用し、レスポンスの `` request``引数として要求を使用して:class: `pyramid.response.FileResponse`を作成します。 :class: `pyramid.response.FileResponse`は、このように使用されたときにできるだけ早くファイルを提供します。渡すファイルのファイル拡張子に基づいて、正しいコンテンツの長さとcontent_typeを設定します。
このようなビューは、トラバーサルの結果として呼び出されるビュー呼び出し可能として構成によって登録することができます。
1 | config.add_view('myapp.views.favicon_view', name='favicon.ico')
|
または、特定のルートで呼び出し可能なビューに登録することもできます。
1 2 | config.add_route('favicon', '/favicon.ico')
config.add_view('myapp.views.favicon_view', route_name='favicon')
|
これは呼び出し可能な単純なビューなので、:term: permission`で保護することも、term: view predicate`引数を使って異なる状況下で応答するように設定することもできます。
アセットのオーバーライド¶
特定の資産をapp: `Pyramid`アプリケーションの外から上書きすると便利なことがよくあります。たとえば、既存の:app: `Pyramid`アプリケーションを多かれ少なかれ変更せずに再利用することができます。ただし、アプリケーションが所有する特定のテンプレートファイルの中に不適切なHTMLが含まれている場合や、スタティックアセット(ロゴファイルやCSSファイルなど)が適切でない場合があります。アプリケーションを完全にフォークすることはできますが、不適切なアセットをオーバーライドしてアプリケーションをそのまま使用すると便利です。これは、いくつかの顧客(CMSアプリケーションやバグ追跡アプリケーションなど)のためにいくつかの"コア"アプリケーションを何度も何度も何度も再利用し、特定のアプリケーションデプロイメントに対して任意の視覚的な変更を加えたい場合に特に当てはまります基礎となるコードをフォークすることなく。
この目的のために、:app: Pyramid`には、ある資産を1つ以上の他の資産と"上書き "する機能を含みます。この機能をサポートするために、a:term: `Configurator APIが存在します:meth:` pyramid.config.Configurator.override_asset`。このAPIを使用すると、任意のPythonパッケージで定義された次の種類のアセットをオーバーライドできます。
- 個々のテンプレートファイル。
- 複数のテンプレートファイルを含むディレクトリ。
- 個々の静的ファイルは、 `` pyramid.static.static_view``ヘルパークラスのインスタンスによって提供されます。
- 静的ファイルのディレクトリで、 `` pyramid.static.static_view``ヘルパークラスのインスタンスによって提供されます。
- setuptools:term: pkg_resources APIを使用するコードで扱われるその他のアセット(またはアセットのセット)。
`` override_asset`` API¶
:meth: `〜pyramid.config.Configurator.override_asset`を個別に呼び出すと、単一のアセットをオーバーライドできます。例えば:
1 2 3 | config.override_asset(
to_override='some.package:templates/mytemplate.pt',
override_with='another.package:othertemplates/anothertemplate.pt')
|
`` override_asset`` APIに送られる `` to_override``と `` override_with``の両方に渡される文字列値は:term: `asset specification`と呼ばれます。仕様のコロン区切り記号は、*パッケージ名*を*資産名*から分離します。コロンと次のアセット名はオプションです。それらが指定されていない場合、オーバーライドは別のパッケージのディレクトリからパッケージへのすべてのルックアップを解決しようとします。例えば:
1 2 | config.override_asset(to_override='some.package',
override_with='another.package')
|
パッケージ内の個々のサブディレクトリも上書きできます。
1 2 | config.override_asset(to_override='some.package:templates/',
override_with='another.package:othertemplates/')
|
ディレクトリを別のディレクトリで上書きする場合は、スラッシュを `` to_override``仕様と `` override_with``仕様の両方の末尾に付ける必要があります。ディレクトリを指す指定の最後にスラッシュを付けると、予期しない結果が発生します。
ディレクトリ指定をファイル指定で上書きすることはできません。逆もできません。試してみると起動エラーが発生します。アセット自体をオーバーライドすることはできません。試してみると起動エラーが発生します。
個々の* package *アセットだけがオーバーライドされます。オーバーライドは、オーバーライドされたパッケージ内のサブパッケージを通過しません。これは、 `` some.package:templates``と `` some.package.views:templates``の両方のアセットをオーバーライドする場合、2つのオーバーライドを登録する必要があることを意味します。
仕様のパッケージ名は、ドットで始まることがあります。これは、パッケージがコンフィギュレーション構築ファイルが存在するパッケージ(または:class: 〜pyramid.config.Configurator`の `package``引数)に相対的であることを意味します。クラス構造)。例えば:
1 2 | config.override_asset(to_override='.subpackage:templates/',
override_with='another.package:templates/')
|
共有された `` to_override``を指定するが、別の `` override_with``を指定する `` override_asset``への複数の呼び出しは、検索パスを形成するためにスタックされます。検索パスに存在する最初のアセットが使用されます。上書きパスに資産が存在しない場合は、元の資産が使用されます。
資産オーバーライドは、テンプレートや静的ファイル以外の資産を実際にオーバーライドできます。 :func: pkg_resources.get_resource_filename、:func:` pkg_resources.get_resource_stream`、または:func: pkg_resources.get_resource_string APIを使用するソフトウェアは、オーバーライドが使用されるときにオーバーライドされたファイルを取得します。
バージョン 1.6 で追加: Pyramid 1.6以降では、ファイルまたはディレクトリへの絶対パスを指定することでアセットをオーバーライドすることもできます。これは、アセットがPythonパッケージの一部として配布されていない場合に便利です。
キャッシュバストと資産のオーバーライド¶
:meth: pyramid.config.Configurator.add_static_view`を使用してホストされている静的アセットをオーバーライドすると、class: pyramid.static.ManifestCacheBuster`のようなアセット対応のキャッシュバスターを使用するときのキャッシュ破棄戦略に影響を与える可能性があります。アセット・アウェア・キャッシュ・バスターは、ロジックを特定のアセットに結び付けている点で違いがあります。たとえば、マニフェストは、事前定義された特定のアセットのセットに対してのみ生成されます。今、このマニフェストで定義されたアセットを、新しい未知のバージョンで上書きしたとします。デフォルトでは、これまでに見たことがないアセットに対してキャッシュバスターが呼び出され、実際に配信されるアセットではなく、元のアセットのキャッシュ破棄トークンが返される可能性があります。この問題を回避するために、異なる:class: pyramid.interfaces.ICacheBuster`実装を新しいアセットに付加することが可能です。これにより、元のアセットはマニフェストによって提供され、新しいアセットは独自のキャッシュ・バスターによって提供されます。これを行うには:meth: `pyramid.config.Configurator.add_cache_buster`は `explicit``オプションをサポートしています。例えば:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from pyramid.static import ManifestCacheBuster
# define a static view for myapp:static assets
config.add_static_view('static', 'myapp:static')
# setup a cache buster for your app based on the myapp:static assets
my_cb = ManifestCacheBuster('myapp:static/manifest.json')
config.add_cache_buster('myapp:static', my_cb)
# override an asset
config.override_asset(
to_override='myapp:static/background.png',
override_with='theme:static/background.png')
# override the cache buster for theme:static assets
theme_cb = ManifestCacheBuster('theme:static/manifest.json')
config.add_cache_buster('theme:static', theme_cb, explicit=True)
|
上記の例では、 `` myapp:static``フォルダから提供されるすべてのアセットに対して、デフォルトのキャッシュ・バスター、 `` my_cb``があります。これは、 `` request.static_url( 'myapp:static / background.png') ``でURLを生成するときに `` theme:static / background.png``にも影響します。
`` theme_cb``は `` theme:static``フォルダから読み込まれたアセットに対して明示的に定義されています。明示的なキャッシュバスターは優先順位があり、 `` request.static_url( 'myapp:static / background.png') ``に対して `` theme_cb``が呼び出されますが、 `` my_cb``は ` request.static_url( 'myapp:static / favicon.ico') `です。