如何为Pylons静态文件设置自定义响应头?
我该怎么给Pylons从公共目录提供的文件添加一个自定义的头部信息呢?
4 个回答
0
在标准的Pylons设置中,公共文件是通过一个叫StaticUrlParser的工具来提供的。这个通常是在你的config/middleware.py文件里的make_app()函数中设置的。
你需要像Antonin ENFRUN所描述的那样,创建一个StaticUrlParser的子类。不过,称它为控制器可能会让人困惑,因为它的作用不同。你可以在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'])
0
在最近的一个版本中,你可以使用“魔法路径信息”这个功能,并根据这里的文档来编写你的控制器,以便调用paster.DirectoryApp。
在我的项目中,我想要提供公共目录下的任何文件,包括子目录,所以我写了这个控制器,以便能够覆盖内容类型:
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')
1
a) 让你的网页服务器从 /public 文件夹提供文件,而不是从 paster 文件夹提供,并且设置一些特殊的头信息。
b) 添加一个特殊的路由,然后自己提供文件,像这样。
class FilesController(BaseController):
def download(self, path)
fapp = FileApp( path, headers=self.get_headers(path) )
return fapp(request.environ, self.start_response)
c) 也许有办法可以覆盖这些头信息,但我不知道怎么做。