首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用django-piston时出现400 Bad Request错误

使用django-piston时出现400 Bad Request错误
EN

Stack Overflow用户
提问于 2010-12-27 15:50:52
回答 7查看 4.1K关注 0票数 11

我正在尝试使用Piston为Django提供REST支持。我已经按照提供的文档实现了我的处理程序。问题是,我可以“读取”和“删除”我的资源,但我不能“创建”或“更新”。每次我点击相关的api时,我都会得到一个400 Bad request错误。

我已经使用这个常用的代码片段扩展了csrf的Resource类:

代码语言:javascript
复制
class CsrfExemptResource(Resource):
    """A Custom Resource that is csrf exempt"""
    def __init__(self, handler, authentication=None):
        super(CsrfExemptResource, self).__init__(handler, authentication)
        self.csrf_exempt = getattr(self.handler, 'csrf_exempt', True)

我的类(代码片段)如下所示:

代码语言:javascript
复制
user_resource = CsrfExemptResource(User)

class User(BaseHandler):
    allowed_methods = ('GET', 'POST', 'PUT', 'DELETE')

    @require_extended
    def create(self, request):
        email = request.GET['email']
        password = request.GET['password']
        phoneNumber = request.GET['phoneNumber']
        firstName = request.GET['firstName']
        lastName = request.GET['lastName']
        self.createNewUser(self, email,password,phoneNumber,firstName,lastName)
        return rc.CREATED

请告诉我如何使用POST操作让create方法工作?

EN

回答 7

Stack Overflow用户

发布于 2011-03-25 08:58:27

这是因为活塞不喜欢ExtJS将“字符集=UTF-8”放在标题的内容类型中的事实。

通过添加一些中间件来使内容类型对Piston更友好,在您的应用程序基目录中创建一个名为middleware.py的文件,这很容易解决:

代码语言:javascript
复制
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

然后,只需在您的settings.py中包含此中间件:

代码语言:javascript
复制
MIDDLEWARE_CLASSES = (
    'appname.middleware.ContentTypeMiddleware',
)
票数 10
EN

Stack Overflow用户

发布于 2011-04-09 17:40:24

提出的解决方案对我仍然不起作用(django 1.2.3/piston 0.2.2),所以我调整了joekrell解决方案,这终于起作用了(我只使用POST和PUT,但想必你可以在列表中添加其他动词):

代码语言:javascript
复制
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']

通过以下方式:

代码语言:javascript
复制
MIDDLEWARE_CLASSES = (
'appname.middleware.ContentTypeMiddleware',
)

我没有注意到任何副作用,但我不能保证它是万无一失的。

票数 7
EN

Stack Overflow用户

发布于 2011-08-24 22:32:40

我结合了其他人的一些说法,并添加了对任何内容类型的支持,例如json……

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4537314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档