首页 > 解决方案 > 我可以在使用 Python Bottle 成功“返回 static_file(...)”后启动操作吗?

问题描述

提供静态文件时:

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

如何在客户端成功 100% 下载文件后立即启动操作?

示例:我想在客户端成功下载临时文件后删除os.remove('tempDS6529QSGYUA41.csv').

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

标签: pythonbottle

解决方案


如果您使用的是 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')

如果您只想在 100% 下载时准确地执行该操作,则应该可以执行以下操作(忽略一些极端情况):

@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)

推荐阅读