注意:抱歉,但我没有必要的声誉分数来发布超过两个链接。下面发布的代码段引用了以下views和支持类“__del__() method。
我在Django中有一个基于函数的视图,它将类的实例存储为django会话的值。
# First view Function
if request.method == 'POST':
logger.info('User %s Began Upload of File %s' % (request.user.username, request.FILES['file']))
form = uploadFileForm1(request.POST, request.FILES)
if form.is_valid():
# form.cleaned_data contains an in memory version of the uploaded file.
uploaded_shp = ShpUploader(form.cleaned_data['file'])
# Store ShpUploader instance in cookie to be referenced
request.session['uploaded_shp'] = uploaded_shp
return HttpResponseRedirect('./2')
else:
for uploadfile_error in form.errors['file']:
logger.warning(uploadfile_error)
在稍后的视图中访问会话,其中我将此对象的一些方法存储在会话中。
# Second view Function
if request.method == 'POST':
# Required to repass shpPath kwarg
form = uploadFileForm2(request.POST,shpPath=request.session['uploaded_shp'].upload_full_path)
if form.is_valid():
# Pass user-defined field mappings to import_shapefile method.
request.session['uploaded_shp'].import_shapefile(form.cleaned_data)
logger.info('Successful - User %s Uploaded File %s' % (request.user.username, request.session['uploaded_shp'].upload_full_path))
return HttpResponseRedirect('./success')
else:
print form.errors
我最初想要覆盖我班级中的__del__()
方法,自动删除此对象引用的文件夹。
# Inside my class definition
def __del__(self):
"""
Given a directory, remove it an its contents.
Intended to clean up temporary files after upload.
"""
shutil.rmtree(self.upload_dir)
logger.info('Delete Successful: %s' % self.upload_dir)
我的问题是为什么我的类'__del__()
方法在第一个视图和第二个视图之间执行,尽管将实际对象存储在会话中?
我尝试使用带有自定义__del__()
方法的类编写一个基本示例,该方法使用字典在函数之间保留对象。这个例子:
class tester(object):
def __init__(self, val):
self.val = val
print 'created in %s' % self.val
def __del__(self):
print 'deleted'
cache = {}
def f1():
print 'in f1'
t = tester('Test Object Value')
cache['tdict'] = t
print cache['tdict'].val
def f2():
print 'in f2'
print cache['tdict'].val
if __name__ == '__main__':
f1()
f2()
生成我期望的输出,仅在退出第二个函数__del__()
后调用f2()
方法。
in f1
created in Test Object Value
Test Object Value
in f2
Test Object Value
deleted
[Finished in 0.1s]
我是否遗漏了有关会话中间件如何工作的内容?我有一个想法是关于弱引用,如果django会话中间件使用这些?请参阅以下文章链接到弱引用。
# Can't post over two links yet.
http://mindtrove.info/python-weak-references/
感谢您的见解。我已经过了这个问题,但我仍然很好奇为什么会出现这种情况。
答案 0 :(得分:1)
__del__
个方法。这正是您的对象在请求结束后所处的状态:在内存中不再有对它的引用。 是数据库行中存储会话信息的引用,但Python并不关心它,当然它不应该:它关注的只是你的视图功能完成后,你的对象超出范围,并被垃圾收集。
在测试函数中,当然,在函数结束后,您确实有一个对象的引用:在cache
字典中。但这与存储在会话中完全不同。
换句话说,这是错误的做法。您必须在构建形状的方法中实现清理代码。 (在会话中存储文件也是一件很奇怪的事情,但现在让我们离开。)