2009-05-07 4 views

답변

2

a) 웹 서버가 paster 대신/public에서 파일을 제공하고 일부 특수 헤더를 전달하도록 구성 할 수 있습니다.

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)는 어쩌면 헤더를 덮어 쓸 수있는 방법이 있고 난 그냥 잘 모릅니다.

+0

반환 전달 (FileApp (path, headers = ...))이 더 좋을지 궁금합니다. (앞으로는 pylons.controllers.util에서 온다.) –

+0

'FileApp' 메소드는 훌륭하게 작동한다. 정말 고마워요. 결국 마침내 실제로 작동합니다! – EMP

0

최근 버전의 route를 사용하면 'Magic path_info'기능을 사용할 수 있으며 여기에서 설명서를 따라 컨트롤러를 작성하여 paster.DirectoryApp를 호출 할 수 있습니다. 내 프로젝트에서

, 나는 하위 디렉토리를 포함하여 공공 디렉토리에있는 파일을 제공 원했고, 콘텐츠 _ 오버라이드 (override) 할 수 있도록, 컨트롤러로이 끝난 : 표준 철탑 설정에서

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') 
0

을의 공개 파일은 StaticUrlParser에서 제공됩니다. 이것은 일반적으로 config/middleware.py : make_app() 함수에서 설정합니다.

Antonin ENFRUN 설명과 같이 StaticUrlParser를 서브 클래스화해야합니다. 컨트롤러를 호출하는 것이 다른 목적을하기 때문에 혼란 스럽습니다.

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') 

후 설정/middleware.py에 StaticUrlParser을 대체 :하여 설정/middleware.py의 상단에 다음과 같이 뭔가를 추가 make_app()를 HeaderUrlParser와

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

static_app = HeaderURLParser(config['pylons.paths']['static_files']) 
된다
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) 

철탑 자동 environstart_response 변수 당신에게 WSGI를 제공합니다. 그렇지 않으면 헤더를 설정하거나 변경하지 않아야합니다. 그렇다면 능력을 사용하여 built in to FileApp을 사용할 수 있습니다.

관련 문제