我可以在使用 Python Bottle 成功 "return static_file(...)" 后启动一个动作吗?
Can I launch an action after a successful "return static_file(...)" with Python Bottle?
提供静态文件时:
@post('/download')
def downloadpage():
return static_file('tempDS6529QSGYUA41.csv', root='temp', download=True)
怎么可能在客户端成功 100% 下载文件后立即启动操作?
例子:我想在客户端os.remove('tempDS6529QSGYUA41.csv')
.
成功下载临时文件后将其删除
注意:如果不能使用 Bottle,我可以使用 Flask 解决方案(我正在犹豫是否要迁移到具有非常相似 API 的 Flask)。
如果您正在使用 Linux 或其他类 Unix OS,您可以利用这一事实,当您删除一个保持打开状态的文件时(static_file
that),文件从目录中消失,但真正的删除被 OS 延迟,直到文件不再打开。这意味着您无需等待文件 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)
提供静态文件时:
@post('/download')
def downloadpage():
return static_file('tempDS6529QSGYUA41.csv', root='temp', download=True)
怎么可能在客户端成功 100% 下载文件后立即启动操作?
例子:我想在客户端os.remove('tempDS6529QSGYUA41.csv')
.
注意:如果不能使用 Bottle,我可以使用 Flask 解决方案(我正在犹豫是否要迁移到具有非常相似 API 的 Flask)。
如果您正在使用 Linux 或其他类 Unix OS,您可以利用这一事实,当您删除一个保持打开状态的文件时(static_file
that),文件从目录中消失,但真正的删除被 OS 延迟,直到文件不再打开。这意味着您无需等待文件 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)