import re import itertools _HTML_TYPES = ('text/html', 'application/xhtml+xml') _SUPPORTED_TRANSFORMS = ['PUT', 'DELETE'] _FORM_RE = re.compile(r'((]*\bmethod=(\'|"|))(%s)((\'|"|)\b[^>]*>))' % '|'.join(_SUPPORTED_TRANSFORMS), re.IGNORECASE) _MIDDLEWARE_KEY = 'method_middleware_transform' class HttpMethodsMiddleware(object): def process_request(self, request): if request.POST and request.POST.has_key(_MIDDLEWARE_KEY): if request.POST[_MIDDLEWARE_KEY].upper() in _SUPPORTED_TRANSFORMS: request.method = request.POST[_MIDDLEWARE_KEY] return None def process_response(self, request, response): if response['Content-Type'].split(';')[0] in _HTML_TYPES: # ensure we don't add the 'id' attribute twice (HTML validity) idattributes = itertools.chain(("id='" + _MIDDLEWARE_KEY + "'",), itertools.repeat('')) def add_transform_field(match): """Returns the matched
tag with a modified method and the added element""" return match.group(2) + "POST" + match.group(5) + \ "
" + \ "
" # Modify any POST forms response.content = _FORM_RE.sub(add_transform_field, response.content) return response