基于Django1.1文件的会话后端多线程解决方案

时间:2010-04-30 15:15:25

标签: django session

我今天阅读了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)

我不太明白这是如何解决完整性问题的。

1 个答案:

答案 0 :(得分:0)

从技术上讲,这并不能完全解决完整性问题。 #9084解决了这个问题。

本质上,这可以通过使用tempfile.mkstemp来保证是原子的,并将数据写入该文件。然后它调用os.rename(),它将临时文件重命名为新文件。在unix中,这将在重命名之前删除旧文件,在Windows中这将引发错误。这应该为django 1.1

修复

如果您查看修订历史记录,您会看到它们之前有锁定,但由于各种原因将它们更改为此方法。