Skip to content

Commit 4921ac7

Browse files
alex-eriasvetlov
authored andcommitted
Create postgres_storage.py (aio-libs#372)
1 parent 642b59a commit 4921ac7

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

examples/postgres_storage.py

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
try:
2+
import aiopg
3+
except ImportError: # pragma: no cover
4+
aiopg = None
5+
import json
6+
import uuid
7+
import warnings
8+
9+
import psycopg2.extras
10+
11+
from distutils.version import StrictVersion
12+
from aiohttp_session import AbstractStorage, Session
13+
14+
15+
class PgStorage(AbstractStorage):
16+
"""PG storage"""
17+
18+
def __init__(self, pg_pool, *, cookie_name="AIOHTTP_SESSION",
19+
domain=None, max_age=None, path='/',
20+
secure=None, httponly=True,
21+
key_factory=lambda: uuid.uuid4(),
22+
encoder=psycopg2.extras.Json, decoder=json.loads):
23+
super().__init__(cookie_name=cookie_name, domain=domain,
24+
max_age=max_age, path=path, secure=secure,
25+
httponly=httponly,
26+
encoder=encoder, decoder=decoder)
27+
self._pg = pg_pool
28+
self._key_factory = key_factory
29+
30+
async def load_session(self, request):
31+
cookie = self.load_cookie(request)
32+
data = {}
33+
if cookie is None:
34+
return Session(None, data={}, new=True, max_age=self.max_age)
35+
else:
36+
async with self._pg.acquire() as conn:
37+
key = uuid.UUID(cookie)
38+
async with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
39+
40+
await cur.execute("SELECT session, extract(epoch from created) FROM web.sessions WHERE uuid = %s", (key,))
41+
data = await cur.fetchone()
42+
43+
if not data:
44+
return Session(None, data={},
45+
new=True, max_age=self.max_age)
46+
47+
return Session(key, data=data, new=False, max_age=self.max_age)
48+
49+
async def save_session(self, request, response, session):
50+
key = session.identity
51+
if key is None:
52+
key = self._key_factory()
53+
self.save_cookie(response, key,
54+
max_age=session.max_age)
55+
else:
56+
if session.empty:
57+
self.save_cookie(response, '',
58+
max_age=session.max_age)
59+
else:
60+
key = str(key)
61+
self.save_cookie(response, key,
62+
max_age=session.max_age)
63+
64+
data = self._get_session_data(session)
65+
data['session'] = self._encoder(data['session'])
66+
expire = session.created + (session.max_age or 0)
67+
async with self._pg.acquire() as conn:
68+
async with conn.cursor() as cur:
69+
70+
await cur.execute("INSERT INTO web.sessions (uuid,session,created,expire)"
71+
" VALUES (%s, %s, to_timestamp(%s),to_timestamp(%s))"
72+
" ON CONFLICT (uuid)"
73+
" DO UPDATE"
74+
" SET (session,expire)=(EXCLUDED.session, EXCLUDED.expire)", [key, data['session'],session.created,expire])

0 commit comments

Comments
 (0)