Skip to content

Instantly share code, notes, and snippets.

@dcramer
Created September 4, 2009 20:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save dcramer/181116 to your computer and use it in GitHub Desktop.
Save dcramer/181116 to your computer and use it in GitHub Desktop.
"""
A two-part middleware which modifies request.COOKIES and adds a set and delete method.
`set` matches django.http.HttpResponse.set_cookie
`delete` matches django.http.HttpResponse.delete_cookie
MIDDLEWARE_CLASSES = (
'django_cookies.CookiePreHandlerMiddleware',
...
'django_cookies.CookiePostHandlerMiddleware',
)
def my_view(request):
request.COOKIES.set([args])
...
return response
"""
from Cookie import SimpleCookie, Morsel
import copy
class CookiePreHandlerMiddleware(object):
"""
This middleware modifies request.COOKIES and adds a set and delete method.
`set` matches django.http.HttpResponse.set_cookie
`delete` matches django.http.HttpResponse.delete_cookie
This should be the first middleware you load.
"""
def process_request(self, request):
cookies = CookieHandler()
for k, v in request.COOKIES.iteritems():
cookies[k] = str(v)
request.COOKIES = cookies
request._orig_cookies = copy.deepcopy(request.COOKIES)
class CookiePostHandlerMiddleware(object):
"""
This middleware modifies updates the response will all modified cookies.
This should be the last middleware you load.
"""
def process_response(self, request, response):
if hasattr(request, '_orig_cookies') and request.COOKIES != request._orig_cookies:
for k,v in request.COOKIES.iteritems():
if request._orig_cookies.get(k) != v:
dict.__setitem__(response.cookies, k, v)
return response
class StringMorsel(Morsel):
def __str__(self):
return self.value
def __eq__(self, a):
if isinstance(a, str):
return str(self) == a
elif isinstance(a, Morsel):
return a.output() == self.output()
return False
def __ne__(self, a):
if isinstance(a, str):
return str(self) != a
elif isinstance(a, Morsel):
return a.output() != self.output()
return True
def __repr__(self):
return str(self)
class CookieHandler(SimpleCookie):
def __set(self, key, real_value, coded_value):
"""Private method for setting a cookie's value"""
M = self.get(key, StringMorsel())
M.set(key, real_value, coded_value)
dict.__setitem__(self, key, M)
def __setitem__(self, key, value):
"""Dictionary style assignment."""
rval, cval = self.value_encode(value)
self.__set(key, rval, cval)
def set(self, key, value='', max_age=None, expires=None, path='/', domain=None, secure=None):
self[key] = value
for var in ('max_age', 'path', 'domain', 'secure', 'expires'):
val = locals()[var]
if val is not None:
self[key][var.replace('_', '-')] = val
def delete(self, key, path='/', domain=None):
self[key] = ''
if path is not None:
self[key]['path'] = path
if domain is not None:
self[key]['domain'] = domain
self[key]['expires'] = 0
self[key]['max-age'] = 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment