Simplified SessionMiddleware.process_response() a bit.

This commit is contained in:
Daniel Hahler 2019-05-29 14:04:42 +02:00 committed by Mariusz Felisiak
parent 480492fe70
commit 59f04d6b8f
1 changed files with 38 additions and 39 deletions

View File

@ -30,46 +30,45 @@ class SessionMiddleware(MiddlewareMixin):
modified = request.session.modified modified = request.session.modified
empty = request.session.is_empty() empty = request.session.is_empty()
except AttributeError: except AttributeError:
pass return response
# First check if we need to delete this cookie.
# The session should be deleted only if the session is entirely empty.
if settings.SESSION_COOKIE_NAME in request.COOKIES and empty:
response.delete_cookie(
settings.SESSION_COOKIE_NAME,
path=settings.SESSION_COOKIE_PATH,
domain=settings.SESSION_COOKIE_DOMAIN,
)
patch_vary_headers(response, ('Cookie',))
else: else:
# First check if we need to delete this cookie. if accessed:
# The session should be deleted only if the session is entirely empty
if settings.SESSION_COOKIE_NAME in request.COOKIES and empty:
response.delete_cookie(
settings.SESSION_COOKIE_NAME,
path=settings.SESSION_COOKIE_PATH,
domain=settings.SESSION_COOKIE_DOMAIN,
)
patch_vary_headers(response, ('Cookie',)) patch_vary_headers(response, ('Cookie',))
else: if (modified or settings.SESSION_SAVE_EVERY_REQUEST) and not empty:
if accessed: if request.session.get_expire_at_browser_close():
patch_vary_headers(response, ('Cookie',)) max_age = None
if (modified or settings.SESSION_SAVE_EVERY_REQUEST) and not empty: expires = None
if request.session.get_expire_at_browser_close(): else:
max_age = None max_age = request.session.get_expiry_age()
expires = None expires_time = time.time() + max_age
else: expires = http_date(expires_time)
max_age = request.session.get_expiry_age() # Save the session data and refresh the client cookie.
expires_time = time.time() + max_age # Skip session save for 500 responses, refs #3881.
expires = http_date(expires_time) if response.status_code != 500:
# Save the session data and refresh the client cookie. try:
# Skip session save for 500 responses, refs #3881. request.session.save()
if response.status_code != 500: except UpdateError:
try: raise SuspiciousOperation(
request.session.save() "The request's session was deleted before the "
except UpdateError: "request completed. The user may have logged "
raise SuspiciousOperation( "out in a concurrent request, for example."
"The request's session was deleted before the "
"request completed. The user may have logged "
"out in a concurrent request, for example."
)
response.set_cookie(
settings.SESSION_COOKIE_NAME,
request.session.session_key, max_age=max_age,
expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,
path=settings.SESSION_COOKIE_PATH,
secure=settings.SESSION_COOKIE_SECURE or None,
httponly=settings.SESSION_COOKIE_HTTPONLY or None,
samesite=settings.SESSION_COOKIE_SAMESITE,
) )
response.set_cookie(
settings.SESSION_COOKIE_NAME,
request.session.session_key, max_age=max_age,
expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,
path=settings.SESSION_COOKIE_PATH,
secure=settings.SESSION_COOKIE_SECURE or None,
httponly=settings.SESSION_COOKIE_HTTPONLY or None,
samesite=settings.SESSION_COOKIE_SAMESITE,
)
return response return response