Как установить настраиваемый заголовок ответа для статических (публичных) файлов пилонов? - PullRequest
3 голосов
/ 07 мая 2009

Как добавить пользовательский заголовок к файлам, которые пилоны обслуживают из общего доступа?

Ответы [ 4 ]

2 голосов
/ 08 мая 2009

a) Позвольте вашему веб-серверу обслуживать файлы из / public вместо paster и настроить его для передачи некоторых специальных заголовков.

б) Добавьте специальный маршрут и подайте файлы самостоятельно ala

class FilesController(BaseController):
    def download(self, path)
        fapp = FileApp( path, headers=self.get_headers(path) )
        return fapp(request.environ, self.start_response)

в) возможно, есть способ перезаписать заголовки, и я просто не знаю, как.

0 голосов
/ 11 декабря 2012

Более простой способ использования FileApp для потоковой передачи, основанный на книге pylons . В приведенном ниже коде предполагается, что ваш маршрут обеспечивает 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, если у вас есть переменные этих имен в сигнатуре вашего метода. В противном случае вам не нужно устанавливать или изменять заголовки, но если вы это сделаете, вы можете использовать способности , встроенные в FileApp , для достижения этого.

0 голосов
/ 17 апреля 2010

В стандартной установке Pylons общедоступные файлы обслуживаются из StaticUrlParser. Обычно это настраивается в вашем config / middleware.py: функция make_app ()

Вам нужно создать подкласс StaticUrlParser, как описывает Антонин ENFRUN, хотя называть его контроллером непонятно, потому что он выполняет другую цель. Добавьте что-то вроде следующего в начало 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')

затем замените StaticUrlParser в config / middleware.py: make_app () на HeaderUrlParser

    static_app = StaticURLParser(config['pylons.paths']['static_files'])

становится

    static_app = HeaderURLParser(config['pylons.paths']['static_files'])
0 голосов
/ 27 октября 2009

В последней версии маршрута вы можете использовать функцию ' 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')
...