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