diff --git a/django/contrib/sessions/backends/file.py b/django/contrib/sessions/backends/file.py index 7d933c678a..9588680fea 100644 --- a/django/contrib/sessions/backends/file.py +++ b/django/contrib/sessions/backends/file.py @@ -1,6 +1,7 @@ import datetime import errno import os +import shutil import tempfile from django.conf import settings @@ -147,7 +148,11 @@ class SessionStore(SessionBase): os.write(output_file_fd, self.encode(session_data).encode()) finally: os.close(output_file_fd) - os.rename(output_file_name, session_file_name) + + # This will atomically rename the file (os.rename) if the OS + # supports it. Otherwise this will result in a shutil.copy2 + # and os.unlink (for example on Windows). See #9084. + shutil.move(output_file_name, session_file_name) renamed = True finally: if not renamed: