pylonsがパブリックから提供しているファイルにカスタムヘッダーを追加するにはどうすればよいですか?
4 に答える
a)Webサーバーに、貼り付けの代わりに/ publicからファイルを提供させ、いくつかの特別なヘッダーを渡すように構成します。
b)特別なルートを追加し、ファイルを自分で提供します
class FilesController(BaseController):
def download(self, path)
fapp = FileApp( path, headers=self.get_headers(path) )
return fapp(request.environ, self.start_response)
c)ヘッダーを上書きする方法があるかもしれませんが、その方法がわかりません。
最近のバージョンのrouteでは、「Magic path_info」機能を使用し、ここからのドキュメントに従って、paster.DirectoryAppを呼び出すようにコントローラーを作成できます。
私のプロジェクトでは、サブディレクトリを含むパブリックディレクトリ内の任意のファイルを提供し、これをコントローラーとして終了して、content_typeをオーバーライドできるようにしました。
import logging
from paste.fileapp import FileApp
from paste.urlparser import StaticURLParser
from pylons import config
from os.path import basename
class ForceDownloadController(StaticURLParser):
def __init__(self, directory=None, root_directory=None, cache_max_age=None):
if not directory:
directory = config['pylons.paths']['static_files']
StaticURLParser.__init__(self, directory, root_directory, cache_max_age)
def make_app(self, filename):
headers = [('Content-Disposition', 'filename=%s' % (basename(filename)))]
return FileApp(filename, headers, content_type='application/octetstream')
pylons bookに基づく、ストリーミングに FileApp を使用するより簡単な方法。以下のコードは、ルートが を提供することを前提としていますsome_file_identifier
が、他の 2 つの変数は「魔法」です (コードの後の説明を参照)。
class MyFileController(BaseController):
def serve(self, environ, start_response, some_file_identifier):
path = self._convert_id_to_path(some_file_identifier)
app = FileApp(path)
return app(environ, start_response)
メソッドの署名に wsgi と変数の名前が含まれている場合、Pylons は自動的に wsgienviron
と変数を提供します。start_response
それ以外の場合は、ヘッダーを設定または変更する必要はありませんが、そうする場合は、FileApp に組み込まれている機能を使用してこれを実現できます。
標準の Pylons セットアップでは、公開ファイルは StaticUrlParser から提供されます。これは通常、 config/middleware.py:make_app() 関数で設定されます
Antonin ENFRUN が説明するように StaticUrlParser をサブクラス化する必要がありますが、それを Controller と呼ぶのは別の目的を行っているため混乱します。config/middleware.py の先頭に次のようなものを追加します。
from paste.fileapp import FileApp
from paste.urlparser import StaticURLParser
class HeaderUrlParser(StaticURLParser):
def make_app(self, filename):
headers = # your headers here
return FileApp(filename, headers, content_type='application/octetstream')
config/middleware.py:make_app() の StaticUrlParser を HeaderUrlParser に置き換えます。
static_app = StaticURLParser(config['pylons.paths']['static_files'])
になる
static_app = HeaderURLParser(config['pylons.paths']['static_files'])