如何为pylons静态(公共)文件设置自定义响应标头?

时间:2009-05-07 18:13:41

标签: python http-headers pylons

如何向文件中添加自定义标头?pylons是从公共服务?

4 个答案:

答案 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 environstart_response个变量。否则你不需要设置或者使用munge标头,但如果你这样做,你可以使用能力built in to FileApp来实现这一点。