Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Store session after callbacks. This fixes #351

  • Loading branch information...
commit d628df6ab6c57b34acfb412e135d0d095636c539 1 parent 7f4c12b
@mitsuhiko authored
Showing with 22 additions and 2 deletions.
  1. +3 −0  CHANGES
  2. +2 −2 flask/app.py
  3. +17 −0 flask/testsuite/basic.py
View
3  CHANGES
@@ -20,6 +20,9 @@ Relase date to be decided, codename to be chosen.
returned to the WSGI server but has the advantage that the garbage
collector is not needed on CPython to tear down the request unless
the user created circular dependencies themselves.
+- Session is now stored after callbacks so that if the session payload
+ is stored in the session you can still modify it in an after
+ request callback.
Version 0.8.1
-------------
View
4 flask/app.py
@@ -1403,8 +1403,6 @@ def process_response(self, response):
"""
ctx = _request_ctx_stack.top
bp = ctx.request.blueprint
- if not self.session_interface.is_null_session(ctx.session):
- self.save_session(ctx.session, response)
funcs = ()
if bp is not None and bp in self.after_request_funcs:
funcs = reversed(self.after_request_funcs[bp])
@@ -1412,6 +1410,8 @@ def process_response(self, response):
funcs = chain(funcs, reversed(self.after_request_funcs[None]))
for handler in funcs:
response = handler(response)
+ if not self.session_interface.is_null_session(ctx.session):
+ self.save_session(ctx.session, response)
return response
def do_teardown_request(self):
View
17 flask/testsuite/basic.py
@@ -279,6 +279,23 @@ def test():
match = re.search(r'\bexpires=([^;]+)', rv.headers['set-cookie'])
self.assert_(match is None)
+ def test_session_stored_last(self):
+ app = flask.Flask(__name__)
+ app.secret_key = 'development-key'
+ app.testing = True
+
+ @app.after_request
+ def modify_session(response):
+ flask.session['foo'] = 42
+ return response
+ @app.route('/')
+ def dump_session_contents():
+ return repr(flask.session.get('foo'))
+
+ c = app.test_client()
+ self.assert_equal(c.get('/').data, 'None')
+ self.assert_equal(c.get('/').data, '42')
+
def test_flashes(self):
app = flask.Flask(__name__)
app.secret_key = 'testkey'
Please sign in to comment.
Something went wrong with that request. Please try again.