我尝试删除我发送给用户后创建的文件:
def download_file(request, contents):
f = NamedTemporaryFile(delete=False)
def test_signal(sender, **kwargs):
print 'finished'
os.remove(f.name)
request_finished.connect(test_signal)
f.write(contents)
f.close()
response = HttpResponse(FileWrapper(open(f.name)), content_type='application/force-download')
response['Content-Disposition'] = 'attachment; filename=%s' % smart_str('file.txt')
return response
下载文件工作正常,但信号不会被触发。
让我感到困惑的是,当我将test_signal()放在download_file()之外时,它确实有效,即在同一级别上面声明它,但如果我这样做,我就无法访问文件的名称去除。
为什么我不能在这个方法中声明它时使用test_signal()?
答案 0 :(得分:1)
默认情况下,信号调度程序使用对接收函数的弱引用,这些引用不被垃圾收集器计为引用。一旦你的视图函数完成,就没有更多(强)引用信号接收器,并且很快就会被Python收集垃圾(假设CPython)。
您需要告诉信号调度员使用强引用:
request_finished.connect(test_signal, weak=False)