【问题标题】:Can I launch an action after a successful "return static_file(...)" with Python Bottle? [duplicate]我可以在使用 Python Bottle 成功“返回 static_file(...)”后启动操作吗? [复制]
【发布时间】:2018-11-28 22:25:54
【问题描述】:

提供静态文件时:

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

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

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

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

【问题讨论】:

    标签: python bottle


    【解决方案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')
    

    如果您只想在 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)
    

    【讨论】:

    • 谢谢@cg909。我在 Windows 上尝试了方法 #1 和 #2,但它们都失败了。有没有比#3 更通用的方法,没有极端情况?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多