Bottle.py以较短的延迟提供较大的图像会导致长度响应为零

时间:2013-01-15 20:09:49

标签: python bottle

我在Bottle.py中定义了以下静态路由

@get('/create/new/image', apply=[auth_request])
def request_new_image():
   file = invoke_image_creation()
   return static_file(file, root='pics',
                      mimetype='image/jpg')

在方法invoke_image_creation()中,使用简单的事件锁(threading.Event)让应用程序阻塞,直到创建映像。然后它应该返回静态文件。

对于小图像,这适用于较大的图像(1280x720,大约50 KB),它返回:

  • HTTP 200
  • 没有回复的内容
  • content-length:0
  • MIME类型:image / jpg

封锁仅持续片刻,非常不到一秒钟,只是为了确保它在那里。

可能导致什么?使用simple routing static files function可以很好地使用完全相同的图片。唯一的区别是,文件预先存在,并在HTTP GET请求中定义。

1 个答案:

答案 0 :(得分:1)

文件打开和文件数据刷新到磁盘之间存在延迟,因此如果您正在查看文件创建事件,则可以轻松返回基本上仍为空文件的内容。

您需要更改通知以侦听更改而不是新文件,或确保新文件已完全形成。

要执行后者,请更改外部流程以在其他位置创建文件,然后在创建图像时将文件移动到您正在观看的位置。如果两个位置在同一个分区上,则移动将是原子的;如果您的文件监控看到该文件出现,则保证它在那时非空。

或者,伪python代码,在你的单独过程中:

import shutil

createImage(locA, filename)
shutil.move(os.path.join(locA, filename), locB)

并观看locB