我试图以这样一种方式扩展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'我不知道是什么导致了这个错误,也不知道我如何处理它。
发布于 2015-04-10 16:05:46
如果响应不是静态的,为什么要使用StaticFileHandler?这可能会打破类中内置的假设。
StaticFileHandler被设计为以有限的方式被子类化,就像其文件中描述的那样。特别是,子类不应该覆盖get(),并且试图这样做会导致所看到的错误。
如果您想要使用龙卷风模板引擎作为磁盘上文件的一种预处理程序,您可以尝试通过覆盖get_content和get_content_size来做到这一点,并让它们调用self.render_string() (还需要考虑到如果模板不是单独独立包含的,则需要更改get_content_version以考虑所有依赖关系)。但是,这需要混乱的缓存,以避免多次呈现模板。最好是A)用普通的RequestHandler动态呈现模板。或者,编写一个小脚本来呈现所有模板,将它们写入磁盘,并将结果作为实际的静态文件提供。
https://stackoverflow.com/questions/29552430
复制相似问题