2

我已经有了基于djangoappengine一个应用程序,Backbone.js的和Django的REST框架使用PATCH请求通过{patch: true}model.save调用款式更新。dev_appserver.py本地拒绝PATCH请求,但接受它部署

我发现,在本地测试dev_appserver返回时:

ERROR 2014-02-19 04:37:04,531 dev_appserver.py:3081] code 501, message Unsupported method ('PATCH')

INFO 2014-02-19 04:37:04,532 dev_appserver.py:3090] "PATCH /api/posts/5707702298738688 HTTP/1.1" 501 -

然而,当我部署它,并通过Appspot上的服务器访问它愉快地接受了该请求。这迫使我每次进行更改时都要部署,并且想要对其进行测试。

我跑了Python SDK的latests版本(1.89),并发现和old fixed issue这似乎解决它,但它似乎other people have had it

我试过this patch但它没有区别。我不明白为什么开发服务器会拒绝他们而不是生产服务器,是否有我需要改变的东西?

谢谢。

+0

这固定的问题涉及在URL中的PATCH方法获取服务,而不是开发Web服务器调整。 [问题975](https://code.google.com/p/googleappengine/issues/detail?id=975)表示PROPPPATCH可以修复WebDAV支持,并且开发Web服务器上仍不支持PATCH :-( –

回答

0

要更新资源,可以使用POST和x-http-method-override进行修补。这是一个有效的RESTful操作,使用POST将与防火墙和较老的用户代理更加兼容。请求中的数据应指明要更新的内容。

var url = '/api/posts/5707702298738688' 
var patch_ops = [ 
     { "op": "replace", "path": "/properties/", "author": text} 
     { "op": "add", "path": "/replies/", {"author": text, "comment":"blah"}} 
     /* 
      { "op": "remove", "path": "https://stackoverflow.com/a/b/c" }, 
      { "op": "add", "path": "https://stackoverflow.com/a/b/c", "value": [ "foo", "bar" ] }, 
      { "op": "replace", "path": "https://stackoverflow.com/a/b/c", "value": 42 }, 
      { "op": "move", "from": "https://stackoverflow.com/a/b/c", "path": "https://stackoverflow.com/a/b/d" }, 
      { "op": "copy", "from": "https://stackoverflow.com/a/b/d", "path": "https://stackoverflow.com/a/b/e" } 
     */ 
    ]; 

var xhr = jQuery.ajax({ 
     type: "POST", 
     beforeSend: function (request) 
     { 
      request.setRequestHeader("X-HTTP-Method-Override", "PATCH"); 
     }, 
     url: url, 
     data: my_json_string, 
     dataType:"json", 
     success: function(data) { 
      return data; 
     }, 
     error: function(xhr, textStatus, error){ 
       return error; 
     } 
    }); 

服务器处理器:

def post(self, object_name): 
    if self.request.headers['x-http-method-override'] == 'PATCH': 
     # update according to patch operations 
     patch_ops_str= self.request.body.decode('utf-8')  
     try: 
      patch_ops = json.loads(new_area_geojson_str) 
     except: 
      self.response.set_status(400) 
      return self.response.out.write('{"status": "error", "reason": "JSON Parse error" }') 

    else: 
     self.response.set_status(405) 
     return self.response.out.write('{"status": "error", "reason": "post not accepted without x-http-method-override to PATCH" }') 

Please do not patch like an idiot