Merge pull request #2354 from davidism/stream-session
Only open session if request does not have open session
This commit is contained in:
commit
3b678b7927
3 changed files with 29 additions and 8 deletions
4
CHANGES
4
CHANGES
|
|
@ -67,6 +67,9 @@ Major release, unreleased
|
||||||
of the generic bad request message. (`#2348`_)
|
of the generic bad request message. (`#2348`_)
|
||||||
- Allow registering new tags with ``TaggedJSONSerializer`` to support
|
- Allow registering new tags with ``TaggedJSONSerializer`` to support
|
||||||
storing other types in the session cookie. (`#2352`_)
|
storing other types in the session cookie. (`#2352`_)
|
||||||
|
- Only open the session if the request has not been pushed onto the context
|
||||||
|
stack yet. This allows ``stream_with_context`` generators to access the same
|
||||||
|
session that the containing view uses. (`#2354`_)
|
||||||
|
|
||||||
.. _#1489: https://github.com/pallets/flask/pull/1489
|
.. _#1489: https://github.com/pallets/flask/pull/1489
|
||||||
.. _#1621: https://github.com/pallets/flask/pull/1621
|
.. _#1621: https://github.com/pallets/flask/pull/1621
|
||||||
|
|
@ -87,6 +90,7 @@ Major release, unreleased
|
||||||
.. _#2326: https://github.com/pallets/flask/pull/2326
|
.. _#2326: https://github.com/pallets/flask/pull/2326
|
||||||
.. _#2348: https://github.com/pallets/flask/pull/2348
|
.. _#2348: https://github.com/pallets/flask/pull/2348
|
||||||
.. _#2352: https://github.com/pallets/flask/pull/2352
|
.. _#2352: https://github.com/pallets/flask/pull/2352
|
||||||
|
.. _#2354: https://github.com/pallets/flask/pull/2354
|
||||||
|
|
||||||
Version 0.12.2
|
Version 0.12.2
|
||||||
--------------
|
--------------
|
||||||
|
|
|
||||||
19
flask/ctx.py
19
flask/ctx.py
|
|
@ -325,15 +325,18 @@ class RequestContext(object):
|
||||||
|
|
||||||
_request_ctx_stack.push(self)
|
_request_ctx_stack.push(self)
|
||||||
|
|
||||||
# Open the session at the moment that the request context is
|
# Open the session at the moment that the request context is available.
|
||||||
# available. This allows a custom open_session method to use the
|
# This allows a custom open_session method to use the request context.
|
||||||
# request context (e.g. code that access database information
|
# Only open a new session if this is the first time the request was
|
||||||
# stored on `g` instead of the appcontext).
|
# pushed, otherwise stream_with_context loses the session.
|
||||||
session_interface = self.app.session_interface
|
|
||||||
self.session = session_interface.open_session(self.app, self.request)
|
|
||||||
|
|
||||||
if self.session is None:
|
if self.session is None:
|
||||||
self.session = session_interface.make_null_session(self.app)
|
session_interface = self.app.session_interface
|
||||||
|
self.session = session_interface.open_session(
|
||||||
|
self.app, self.request
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.session is None:
|
||||||
|
self.session = session_interface.make_null_session(self.app)
|
||||||
|
|
||||||
def pop(self, exc=_sentinel):
|
def pop(self, exc=_sentinel):
|
||||||
"""Pops the request context and unbinds it by doing that. This will
|
"""Pops the request context and unbinds it by doing that. This will
|
||||||
|
|
|
||||||
|
|
@ -861,6 +861,20 @@ class TestStreaming(object):
|
||||||
assert rv.data == b'Hello World!'
|
assert rv.data == b'Hello World!'
|
||||||
assert called == [42]
|
assert called == [42]
|
||||||
|
|
||||||
|
def test_stream_keeps_session(self, app, client):
|
||||||
|
@app.route('/')
|
||||||
|
def index():
|
||||||
|
flask.session['test'] = 'flask'
|
||||||
|
|
||||||
|
@flask.stream_with_context
|
||||||
|
def gen():
|
||||||
|
yield flask.session['test']
|
||||||
|
|
||||||
|
return flask.Response(gen())
|
||||||
|
|
||||||
|
rv = client.get('/')
|
||||||
|
assert rv.data == b'flask'
|
||||||
|
|
||||||
|
|
||||||
class TestSafeJoin(object):
|
class TestSafeJoin(object):
|
||||||
def test_safe_join(self):
|
def test_safe_join(self):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue