我正在尝试使用Piston为Django提供REST支持。我已经按照提供的文档实现了我的处理程序。问题是,我可以“读取”和“删除”我的资源,但我不能“创建”或“更新”。每次我点击相关的api时,我都会得到一个400 Bad request错误。
我已经使用这个常用的代码片段扩展了csrf的Resource类:
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)我的类(代码片段)如下所示:
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方法工作?
发布于 2011-03-25 08:58:27
这是因为活塞不喜欢ExtJS将“字符集=UTF-8”放在标题的内容类型中的事实。
通过添加一些中间件来使内容类型对Piston更友好,在您的应用程序基目录中创建一个名为middleware.py的文件,这很容易解决:
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中包含此中间件:
MIDDLEWARE_CLASSES = (
'appname.middleware.ContentTypeMiddleware',
)发布于 2011-04-09 17:40:24
提出的解决方案对我仍然不起作用(django 1.2.3/piston 0.2.2),所以我调整了joekrell解决方案,这终于起作用了(我只使用POST和PUT,但想必你可以在列表中添加其他动词):
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']通过以下方式:
MIDDLEWARE_CLASSES = (
'appname.middleware.ContentTypeMiddleware',
)我没有注意到任何副作用,但我不能保证它是万无一失的。
发布于 2011-08-24 22:32:40
我结合了其他人的一些说法,并添加了对任何内容类型的支持,例如json……
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 Nonehttps://stackoverflow.com/questions/4537314
复制相似问题