我今天阅读了django.contrib.sessions.backend.file
,在save
SessionStore
方法中,有以下内容用于实现多线程保存完整性:
output_file_fd, output_file_name = tempfile.mkstemp(dir=dir,
prefix=prefix + '_out_')
renamed = False
try:
try:
os.write(output_file_fd, self.encode(session_data))
finally:
os.close(output_file_fd)
os.rename(output_file_name, session_file_name)
renamed = True
finally:
if not renamed:
os.unlink(output_file_name)
我不太明白这是如何解决完整性问题的。
答案 0 :(得分:0)
从技术上讲,这并不能完全解决完整性问题。 #9084解决了这个问题。
本质上,这可以通过使用tempfile.mkstemp来保证是原子的,并将数据写入该文件。然后它调用os.rename(),它将临时文件重命名为新文件。在unix中,这将在重命名之前删除旧文件,在Windows中这将引发错误。这应该为django 1.1
修复如果您查看修订历史记录,您会看到它们之前有锁定,但由于各种原因将它们更改为此方法。