如何向文件中添加自定义标头?pylons是从公共服务?
答案 0 :(得分:2)
a)让您的网络服务器从/ public而不是paster提供文件,并将其配置为传递一些特殊的标题。
b)添加特殊路线serve the files yourself ala
class FilesController(BaseController):
def download(self, path)
fapp = FileApp( path, headers=self.get_headers(path) )
return fapp(request.environ, self.start_response)
c)也许有一种方法可以覆盖标题,我只是不知道如何。
答案 1 :(得分:0)
使用最新版本的路由,您可以使用“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')
答案 2 :(得分: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')
然后使用HeaderUrlParser替换config / middleware.py:make_app()中的StaticUrlParser
static_app = StaticURLParser(config['pylons.paths']['static_files'])
变为
static_app = HeaderURLParser(config['pylons.paths']['static_files'])
答案 3 :(得分:0)
基于pylons book,使用FileApp进行流式传输的更简单方法。下面的代码假设您的路由提供some_file_identifier
,但其他两个变量是“魔术”(请参阅代码后的说明)。
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)
如果您的方法签名中包含这些名称的变量,Pylons会自动为您提供wsgi environ
和start_response
个变量。否则你不需要设置或者使用munge标头,但如果你这样做,你可以使用能力built in to FileApp来实现这一点。