I get a 400 Bad Request error while using django-piston I get a 400 Bad Request error while using django-piston django django

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