Skip to content

Commit dc89982

Browse files
panagiksasvetlov
authored andcommitted
Use new-style (decorated) middleware syntax (#217)
* Use new-style (decorated) midleware syntax * Fix required aiohttp version & mention support for Python 3.6 * Add test for stream response, prepared response and bad type response
1 parent 9878a56 commit dc89982

File tree

3 files changed

+85
-28
lines changed

3 files changed

+85
-28
lines changed

aiohttp_session/__init__.py

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -118,35 +118,31 @@ def session_middleware(storage):
118118

119119
assert isinstance(storage, AbstractStorage), storage
120120

121+
@web.middleware
121122
@asyncio.coroutine
122-
def factory(app, handler):
123-
124-
@asyncio.coroutine
125-
def middleware(request):
126-
request[STORAGE_KEY] = storage
127-
raise_response = False
128-
try:
129-
response = yield from handler(request)
130-
except web.HTTPException as exc:
131-
response = exc
132-
raise_response = True
133-
if not isinstance(response, web.StreamResponse):
134-
raise RuntimeError("Expect response, not {!r}", type(response))
135-
if not isinstance(response, web.Response):
136-
# likely got websoket or streaming
137-
return response
138-
if response.prepared:
139-
raise RuntimeError(
140-
"Cannot save session data into prepared response")
141-
session = request.get(SESSION_KEY)
142-
if session is not None:
143-
if session._changed:
144-
yield from storage.save_session(request, response, session)
145-
if raise_response:
146-
raise response
123+
def factory(request, handler):
124+
request[STORAGE_KEY] = storage
125+
raise_response = False
126+
try:
127+
response = yield from handler(request)
128+
except web.HTTPException as exc:
129+
response = exc
130+
raise_response = True
131+
if not isinstance(response, web.StreamResponse):
132+
raise RuntimeError("Expect response, not {!r}", type(response))
133+
if not isinstance(response, web.Response):
134+
# likely got websoket or streaming
147135
return response
148-
149-
return middleware
136+
if response.prepared:
137+
raise RuntimeError(
138+
"Cannot save session data into prepared response")
139+
session = request.get(SESSION_KEY)
140+
if session is not None:
141+
if session._changed:
142+
yield from storage.save_session(request, response, session)
143+
if raise_response:
144+
raise response
145+
return response
150146

151147
return factory
152148

setup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
def read(f):
1616
return open(os.path.join(os.path.dirname(__file__), f)).read().strip()
1717

18-
install_requires = ['aiohttp>=1.0.2']
18+
install_requires = ['aiohttp>=2.3.0']
1919
extras_require = {
2020
'aioredis': ['aioredis>=0.1.4'],
2121
'pycrypto': ['cryptography'],
@@ -35,6 +35,7 @@ def read(f):
3535
'Programming Language :: Python :: 3',
3636
'Programming Language :: Python :: 3.4',
3737
'Programming Language :: Python :: 3.5',
38+
'Programming Language :: Python :: 3.6',
3839
'Topic :: Internet :: WWW/HTTP',
3940
'Framework :: AsyncIO',
4041
],

tests/test_response_types.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import asyncio
2+
import pytest
3+
4+
from aiohttp import web
5+
from aiohttp.test_utils import make_mocked_request
6+
from aiohttp_session import (session_middleware,
7+
get_session, SimpleCookieStorage, SESSION_KEY)
8+
9+
10+
def create_app(loop, *handlers):
11+
middleware = session_middleware(SimpleCookieStorage())
12+
app = web.Application(middlewares=[middleware], loop=loop)
13+
for url, handler in handlers:
14+
app.router.add_route('GET', url, handler)
15+
return app
16+
17+
18+
@asyncio.coroutine
19+
def test_stream_response(test_client):
20+
21+
@asyncio.coroutine
22+
def stream_response(request):
23+
session = yield from get_session(request)
24+
session['will_not'] = 'show up'
25+
return web.StreamResponse()
26+
27+
client = yield from test_client(create_app,
28+
('/stream', stream_response))
29+
30+
resp = yield from client.get('/stream')
31+
assert resp.status == 200
32+
assert SESSION_KEY.upper() not in resp.cookies
33+
34+
35+
@asyncio.coroutine
36+
def test_bad_response_type(test_client):
37+
38+
@asyncio.coroutine
39+
def bad_response(request):
40+
return ''
41+
42+
middleware = session_middleware(SimpleCookieStorage())
43+
req = make_mocked_request('GET', '/')
44+
with pytest.raises(RuntimeError):
45+
yield from middleware(req, bad_response)
46+
47+
48+
@asyncio.coroutine
49+
def test_prepared_response_type(test_client):
50+
51+
@asyncio.coroutine
52+
def prepared_response(request):
53+
resp = web.Response()
54+
yield from resp.prepare(request)
55+
return resp
56+
57+
middleware = session_middleware(SimpleCookieStorage())
58+
req = make_mocked_request('GET', '/')
59+
with pytest.raises(RuntimeError):
60+
yield from middleware(req, prepared_response)

0 commit comments

Comments
 (0)