使用Python Bottle成功“返回static_file(...)”后,我可以启动动作吗?

时间:2018-06-19 21:25:04

标签: python bottle

投放静态文件时:

@post('/download')
def downloadpage():
    return static_file('tempDS6529QSGYUA41.csv', root='temp', download=True)

在客户端成功100%下载文件后,怎么可能启动操作?

示例:当客户端使用os.remove('tempDS6529QSGYUA41.csv')成功下载临时文件后,我想删除该临时文件。

注意:如果无法使用Bottle,我可以使用Flask解决方案(我很犹豫是否要迁移到具有相似API的Flask)。

1 个答案:

答案 0 :(得分:1)

如果您使用的是Linux或其他类似Unix的操作系统,则可以利用以下事实:当删除保持打开状态的文件(static_file这样做)时,该文件将从目录中消失,但是操作系统将延迟真正的删除操作,直到不再打开该文件为止。这意味着您无需等待文件被100%下载。

@post('/download')
def downloadpage():
    f = static_file('tempDS6529QSGYUA41.csv', root='temp', download=True)
    os.remove('tempDS6529QSGYUA41.csv')
    return f

或(即使打开文件时发生错误也要执行操作):

@post('/download')
def downloadpage():
    try:
        return static_file('tempDS6529QSGYUA41.csv', root='temp', download=True)
    finally:
        os.remove('tempDS6529QSGYUA41.csv')

如果您只想准确执行该操作,并准确地下载了该操作,则应该执行以下操作(忽略某些极端情况):

@post('/download')
def downloadpage():

    # Ignore partial download request that would confuse our code
    if 'HTTP_RANGE' in request.environ:
        del request.environ['HTTP_RANGE']

    def wrapper_iterator(f):
        for chunk in WSGIFileWrapper(f):
            yield f

        os.remove('tempDS6529QSGYUA41.csv')

    f = static_file('tempDS6529QSGYUA41.csv', root='temp', download=True)
    return wrapper_iterator(f)