在StaticFileHandler中使用self.render()

时间:2015-04-10 02:39:43

标签: python tornado attributeerror staticfilehandler

我尝试以这样的方式扩展StaticFileHandler,以便我可以处理文件请求,但在文件上调用self.render(filename, **kwargs)以实际将其提供给客户端。 (是的,我意识到那时它本身不再是静态文件)。

这是我尝试运行的代码:

class MustacheFileHandler(tornado.web.StaticFileHandler):
    def get(self, filename):
        self.render(_STATIC_ROOT_ + '/' + path.split('/')[len(path.split('/'))-2], userLoginStatus='you are logged out!')

# ...
class Application(tornado.web.Application):
    def __init__(self, **overrides):
         handlers = [(r'/(.*)', MustacheFileHandler, {'path' : _STATIC_ROOT_})]
# ...

... _STATIC_ROOT_是我的服务器在启动时加载的配置文件中包含的变量。

我遇到的问题是,每当我尝试对服务器上存在的文件执行GET时,我都会收到以下错误:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1332, in _execute
    result = method(*self.path_args, **self.path_kwargs)
  File "myfile.py", line 173, in get
    self.render(_STATIC_ROOT_ + '/' + path.split('/')[len(path.split('/'))-2], userLoginStatus='you are logged out!')
  File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 747, in render
    self.finish(html)
  File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 877, in finish
    self.set_etag_header()
  File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1257, in set_etag_header
    etag = self.compute_etag()
  File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 2185, in compute_etag
    version_hash = self._get_cached_version(self.absolute_path)
AttributeError: 'MustacheFileHandler' object has no attribute 'absolute_path'

我不确定导致此错误的原因或处理方式。

1 个答案:

答案 0 :(得分:2)

如果响应不是静态的,为什么要使用StaticFileHandler?这可能会破坏课堂上的假设。

StaticFileHandler被设计为以its documentation中描述的有限方式进行子类化。特别是,子类不应覆盖get(),并且尝试这样做会导致您看到的错误。

如果您想将Tornado模板引擎用作磁盘上文件的一种预处理器,您可以尝试通过覆盖get_contentget_content_size,并让它们调用{{}来实现此目的。 1}}(另请注意,如果您的模板不是单独自包含的,则您需要更改self.render_string()以考虑所有依赖项)。但是,这需要混乱的缓存以避免多次渲染模板。它可能更好A A)使用普通的RequestHandler动态渲染模板。或者B)编写一个小脚本来渲染所有模板,将它们写入磁盘,并将结果作为实际静态文件提供。