当我在Django应用程序中引发异常时,我有一个奇怪的行为。请在这个片段(我删除了所有不必要的代码):
@csrf_exempt
def main(request):
ems_db = EmsDatabase()
# raise AssertionError
return HttpResponse('OK\n', content_type='text/plain')
class EmsDatabase:
def __init__(self):
pass
def __del__(self):
print('>>>>>>>>>>>>>>>> DEL')
运行这个函数(显然是通过正确的http调用),EmsDatabase类被实例化为正确的垃圾回收;我在Django服务器日志中看到了打印输出。
但是,如果我取消对raise AssertionError行的注释,那么我没有得到打印输出,并且该对象仍处于活动状态;只要修改源文件以触发服务器重新加载,就会使该对象失去对自身的引用,并被垃圾回收(出现打印行)。
为什么Django(v2.0.7,python 3.6,Linux)会保留对我的对象的引用,或者更可能是对main()函数框架的引用?我能做什么?