javascript - Flask:删除 @after_this_request 装饰器中的文件不起作用。文件正被另一个进程使用
问题描述
嗨,我想下载一个 zip 文件,然后在下载完成后将其删除。
@app.route('/download',methods=['GET', 'POST'])
def download():
projectTitle = request.args.get('projectTitle')
file_path = projectTitle+".zip"
@after_this_request
def remove_file(response):
print("After this request...")
os.remove(file_path)
return response
return send_file(file_path,
mimetype='application/zip',
attachment_filename=file_path,
as_attachment=True)
我用 javascript 调用这个端点:
function downloadURI(uri)
{
var link = document.createElement("a");
link.href = uri;
link.target = "_blank";
link.click();
}
downloadURI("download?projectTitle="+title);
zip文件永远不会被删除,我错过了什么?
编辑:我调试了一下,我注意到我收到以下错误:
After this request...
After this request...
[2020-07-10 13:00:40,653] ERROR in app: Exception on /download [GET]
Traceback (most recent call last):
File "C:\Users\ceccolig\PycharmProjects\SingleBP\venv\lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\ceccolig\PycharmProjects\SingleBP\venv\lib\site-packages\flask\app.py", line 1953, in full_dispatch_request
return self.finalize_request(rv)
File "C:\Users\ceccolig\PycharmProjects\SingleBP\venv\lib\site-packages\flask\app.py", line 1970, in finalize_request
response = self.process_response(response)
File "C:\Users\ceccolig\PycharmProjects\SingleBP\venv\lib\site-packages\flask\app.py", line 2267, in process_response
response = handler(response)
File "C:/Users/ceccolig/PycharmProjects/SingleBP/app.py", line 39, in remove_file
os.remove(file_path)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'DemoTMD-prod.zip'
[2020-07-10 13:00:40,656] ERROR in app: Request finalizing failed with an error while handling an error
Traceback (most recent call last):
File "C:\Users\ceccolig\PycharmProjects\SingleBP\venv\lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\ceccolig\PycharmProjects\SingleBP\venv\lib\site-packages\flask\app.py", line 1953, in full_dispatch_request
return self.finalize_request(rv)
File "C:\Users\ceccolig\PycharmProjects\SingleBP\venv\lib\site-packages\flask\app.py", line 1970, in finalize_request
response = self.process_response(response)
File "C:\Users\ceccolig\PycharmProjects\SingleBP\venv\lib\site-packages\flask\app.py", line 2267, in process_response
response = handler(response)
File "C:/Users/ceccolig/PycharmProjects/SingleBP/app.py", line 39, in remove_file
os.remove(file_path)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'DemoTMD-prod.zip'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\ceccolig\PycharmProjects\SingleBP\venv\lib\site-packages\flask\app.py", line 1970, in finalize_request
response = self.process_response(response)
File "C:\Users\ceccolig\PycharmProjects\SingleBP\venv\lib\site-packages\flask\app.py", line 2267, in process_response
response = handler(response)
File "C:/Users/ceccolig/PycharmProjects/SingleBP/app.py", line 39, in remove_file
os.remove(file_path)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'DemoTMD-prod.zip'
127.0.0.1 - - [10/Jul/2020 13:00:40] "GET /download?projectTitle=DemoTMD-prod HTTP/1.1" 500 -
如您所见,@after_this_request 被调用了两次(我不知道为什么),实际上“在此请求之后”被打印了两次。
解决方案
如你所见,当被@after_this_request
装饰的方法调用时,这个请求生命还没有结束,客户端还在等待响应,所以文件还在打开,或者你可以说它正在被使用,所以你不能删除文件。
好吧,这是我的解决方案。就像:
from stuff import celery_app
@celery_app.task(queue='some_specific_queue')
def delete_files(filepath):
try:
os.remove(filepath)
except FileNotFoundError:
# some other stuff
而在你的api中,你可以像这样发布这个任务:</p>
import datetime
@app.route('/download',methods=['GET', 'POST'])
def download():
projectTitle = request.args.get('projectTitle')
file_path = projectTitle+".zip"
delete_files.apply_async(
args=(file_path),
eta=datetime.datetime.utcnow()+datetime.timedelta(hours=4)
)
return send_file(file_path,
mimetype='application/zip',
attachment_filename=file_path,
as_attachment=True)
我不知道怎么对人...
推荐阅读
- mysql - 添加分钟到时间戳并选择未过期的记录
- python - Huggingface 在情绪分析任务中给出 pytorch 索引错误
- cicd - `rebar3 app`:如何在虚拟机启动后立即运行脚本?
- reactjs - graphql error 参数验证错误(注册表单验证)
- python - 如何通过另一个 2d 索引数组对 2d numpy-array 的每一行进行排序?
- c - 如何将 exec 调用的输出保存到 pipe()?
- postgresql - 提高 postgres 视图性能
- visual-studio - 如何在 Moq 框架中实现 ProtectedExtension.cs?
- c# - 如何在 Visual Studio Code 中查找连接字符串
- c# - 在引用的项目中获取主项目的版本