Skip to content

Instantly share code, notes, and snippets.

@jackyyf
Created February 1, 2014 06:04
Show Gist options
  • Save jackyyf/8748633 to your computer and use it in GitHub Desktop.
Save jackyyf/8748633 to your computer and use it in GitHub Desktop.
from YourProjectName import settings
import datetime
_unit = dict(
s=1,
m=60,
h=3600,
d=86400,
)
try:
if isinstance(settings.COOKIE_EXPIRE, (str, unicode)):
if settings.COOKIE_EXPIRE[-1].lower() in 'smhd':
num = int(settings.COOKIE_EXPIRE[:-1])
_expire = num * _unit[settings.COOKIE_EXPIRE[-1].lower()]
else:
_expire = int(settings.COOKIE_EXPIRE)
elif isinstance(settings.COOKIE_EXPIRE, (int, long)):
_expire = int(settings.COOKIE_EXPIRE)
else:
_expire = int(str(settings.COOKIE_EXPIRE))
except:
_expire = 86400 * 7 # 7 days
class CookieIO(object):
def __init__(self, handler):
'''
@param handler: CookieHandler
'''
self._handler = handler
self._expire = _expire
def get(self, key, default=None):
return self._handler.cookie.get(key=key, default=default)
def set(self, key, value, expire=_expire, domain=None, secure_only=None, httponly=False):
if secure_only is None:
secure_only = self._handler.request.is_secure()
self._handler.set_cookie(key=key, value=value, expire=expire, domain=domain, secure_only=secure_only, httponly=httponly)
def remove(self, key, domain=None, secure_only=None, httponly=False):
if secure_only is None:
secure_only = self._handler.request.is_secure()
self.set(key=key, value='XXX', expire=-233333333, domain=domain, secure_only=secure_only, httponly=httponly)
def __delitem__(self, key):
self.remove(key)
def __getitem__(self, key):
return self._handler.cookie.__getitem__(key)
def __setitem__(self, key, value):
if not isinstance(key, (str, unicode)):
raise KeyError('key should be a string or unicode')
if not isinstance(value, (str, unicode)):
if hasattr(value, '__str__'):
value = value.__str__()
elif hasattr(value, '__unicode__'):
value = value.__unicode__()
else:
raise ValueError('value can not be converted to string or unicode.')
self.set(key=key, value=value)
class CookieHandler(object):
def __init__(self):
self.changed_cookie = {}
def _make_time(self, life):
return datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=life), '%a, %d %b %Y %H:%M:%S GMT')
def set_cookie(self, key, value, expire, domain, secure_only, httponly):
self.changed_cookie[key] = (value, expire, domain, secure_only, httponly)
def process_request(self, request):
self.cookie = request.COOKIES
self.request = request
request.Cookies = CookieIO(self)
def process_response(self, request, response):
for cookie in self.changed_cookie.iteritems():
key, values = cookie
response.set_cookie(key=key, value=values[0], expires=self._make_time(values[1]), domain=values[2], secure=values[3], httponly=values[4])
return response
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment