【问题标题】:How to get CherryPy to follow symbolic links?如何让 CherryPy 跟随符号链接?
【发布时间】:2014-11-30 20:54:11
【问题描述】:
我正在尝试运行一个本地服务器,该服务器(目前)主要提供来自 Windows 7 机器的静态内容。问题是很多内容都是使用符号链接组织的,当我尝试使用 CherryPy 提供这些文件时,它们总是返回:
请求的资源返回的字节数比声明的 Content-Length 多。
这可能是因为 CherryPy 检查磁盘上符号链接的大小,将其用于 Content-Length,然后当它尝试访问文件时,Windows 将文件的完整大小提供给它,所以两者不不匹配。我猜这个问题已经在某个时候得到了解决,并且有一个我不知道的配置选项,但我似乎无法找到所有 CherryPy 配置选项的完整列表。有人对此有好的解决方案吗?
【问题讨论】:
标签:
python
windows
symlink
cherrypy
【解决方案1】:
据我所知,这个问题与 CherryPy 无关。如果您查看过cherrypy.lib.static.serve_file,您会看到以下内容。
try:
st = os.stat(path)
except OSError:
if debug:
cherrypy.log('os.stat(%r) failed' % path, 'TOOLS.STATIC')
raise cherrypy.NotFound()
# ...
# Set Content-Length and use an iterable (file object)
# this way CP won't load the whole file in memory
content_length = st.st_size
fileobj = open(path, 'rb')
return _serve_fileobj(fileobj, content_type, content_length, debug=debug)
Python 文档说明了 os.stat:
在给定路径上执行相当于 stat() 系统调用。
(此函数遵循符号链接;要统计符号链接,请使用 lstat()。)
Wikipedia points to restrictions 创建符号链接,因为只有提升的管理员才能创建它们。所以它看起来不像一个共同的特征。这些链接的类型也很少,启用它们的方法也很少,因此它们的行为可能会有所不同。
无论如何,很容易检查os.stat 是否真的遵循了您平台上的符号链接:
import os
print os.stat('/path/to/filename').st_size
如果您认为结果不正确,我建议您向Python bug tracker 提交报告。