Skip to content

Instantly share code, notes, and snippets.

@awesomebjt
Created August 20, 2016 13:44
Show Gist options
  • Save awesomebjt/14b5ece06a58fe425be5eb31069bcad3 to your computer and use it in GitHub Desktop.
Save awesomebjt/14b5ece06a58fe425be5eb31069bcad3 to your computer and use it in GitHub Desktop.
Store your Flask sessions in DynamoDB - Python 3.5
from uuid import uuid4
from datetime import datetime, timedelta
from flask.sessions import SessionInterface, SessionMixin
from werkzeug.datastructures import CallbackDict
import boto3
class DynamoSession(CallbackDict, SessionMixin):
def __init__(self, initial=None, sid=None):
CallbackDict.__init__(self, initial)
self.sid = sid
self.modified = False
class DynamoSessionInterface(SessionInterface):
def __init__(self, host='', port=0,
db='sessions', collection='sessions'):
client = boto3.client('dynamodb')
self.store = client
self.table = collection
def open_session(self, app, request):
sid = request.cookies.get(app.session_cookie_name)
if sid:
db_response = self.store.get_item(TableName=self.table,
Key={'sid': {'S': sid}},
ConsistentRead=True)
stored_session = None
if 'Item' in db_response:
stored_session = dict()
stored_session['expiration'] = datetime.fromtimestamp(int(db_response['Item']['expiration']['N']))
stored_session['data'] = db_response['Item']['data']['M']
stored_session['sid'] = db_response['Item']['sid']['S']
if stored_session:
now = datetime.now()
if stored_session['expiration'] > now:
return DynamoSession(initial=stored_session['data'],
sid=stored_session['sid'])
sid = str(uuid4())
return DynamoSession(sid=sid)
def save_session(self, app, session, response):
domain = self.get_cookie_domain(app)
if not session:
response.delete_cookie(app.session_cookie_name,
domain=domain)
return
if self.get_expiration_time(app, session):
expiration = self.get_expiration_time(app, session)
else:
expiration = int(((datetime.utcnow() + timedelta(hours=1))-datetime.utcfromtimestamp(0)).total_seconds())
self.store.put_item(TableName=self.table,
Item={
'sid': {'S': str(session.sid)},
'data': {'M': session},
'expiration': {'N': str(expiration)}
}
)
response.set_cookie(app.session_cookie_name, session.sid,
expires=self.get_expiration_time(app, session),
httponly=True, domain=domain)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment