在方法

时间:2017-06-26 22:11:43

标签: django

我尝试删除我发送给用户后创建的文件:

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()?

1 个答案:

答案 0 :(得分:1)

默认情况下,信号调度程序使用对接收函数的弱引用,这些引用不被垃圾收集器计为引用。一旦你的视图函数完成,就没有更多(强)引用信号接收器,并且很快就会被Python收集垃圾(假设CPython)。

您需要告诉信号调度员使用强引用:

request_finished.connect(test_signal, weak=False)