I get a 400 Bad Request error while using django-piston
This is happening because Piston doesn't like the fact that ExtJS is putting "charset=UTF-8" in the content-type of the header.
Easily fixed by adding some middleware to make the content-type a bit more Piston friendly, create a file called middleware.py in your application base directory:
class ContentTypeMiddleware(object): def process_request(self, request): if request.META['CONTENT_TYPE'] == 'application/x-www-form-urlencoded; charset=UTF-8': request.META['CONTENT_TYPE'] = 'application/x-www-form-urlencoded' return None
Then simply include this middleware in your settings.py:
MIDDLEWARE_CLASSES = ( 'appname.middleware.ContentTypeMiddleware',)
Proposed solutions still did not work for me (django 1.2.3/piston 0.2.2) so I've tweaked joekrell solution and this finally works (I'm only using POST and PUT, but presumably you can add other verbs to the list):
class ContentTypeMiddleware(object):def process_request(self, request): if request.method in ('POST', 'PUT'): # dont break the multi-part headers ! if not 'boundary=' in request.META['CONTENT_TYPE']: del request.META['CONTENT_TYPE']
with:
MIDDLEWARE_CLASSES = ('appname.middleware.ContentTypeMiddleware',)
I haven't noticed any side-effect, but I can't promise it's bullet-proof.
I have combined some of what other people have said, and added support for any content type, json for instance...
class ContentTypeMiddleware(object): def process_request(self, request): if request.method in ('POST', 'PUT') and request.META['CONTENT_TYPE'].count(";") > 0: request.META['CONTENT_TYPE'] = [c.strip() for c in request.META['CONTENT_TYPE'].split(";") ][0] return None