python - 我可以在使用 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)。
解决方案
如果您使用的是 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)
推荐阅读
- marklogic - MarkLogic - 查询选项 - 对多个属性进行排序
- javascript - 数组映射到带有换行符的字符串 - React
- android - Appium getText() 在 AndroidElement 上的 sendKeys() 之后抛出 NoSuchElementException
- java - JSoup 尝试连接到错误的 URL
- jq - jq:传递不带引号的字符串参数
- eclipse - 在 Eclipse 控制台中看不到 Glassfish 日志
- html - 减少输入文本和底部边框之间的间距
- python - 可以将列表作为元素的元组作为字典python中的键吗?
- three.js - THREE.js - 四元数偏移/校准
- php - 使用邮件功能时尝试获取非对象的属性“名称”