如何在Google App Engine Python的请求处理程序中使用delete()方法

时间:2010-09-18 08:00:32

标签: python google-app-engine

在GAE Python中,我可以使用

class MyRequestHandler(webapp.RequestHandler):
    def get(self):
        pass #Do Something...
    def post(self):
        pass #Do Something...

处理GET和POST请求。但是我如何处理DELETE和PUT?我在API文档中看到了delete()和put(),但我不知道如何编写表单来模拟DELETE和PUT。

我知道在Rails中,我可以使用带有隐藏字段的post方法来模拟这样的请求:

<input type="hidden" name="_method" value="delete" />

和Rails自动处理脏工作。

在GAE python中有没有类似的方法呢?

我在谷歌搜索过这个,但没有运气。

感谢。

4 个答案:

答案 0 :(得分:6)

您可以使用接受get,post,delete和put等所有方法的请求方法。 然后,您可以相应地检查它的请求类型。

检查一下:

http://gdata-python-client.googlecode.com/svn/trunk/pydocs/gdata.urlfetch.html

<form method="post" action="">
 <input type="hidden" name="_method" value="put" />
 <input type="text" name="name" value="" />
 <input type="submit" value="Save" />
</form> 

def post(self):
    method= self.request.get("_method")
    if method == 'put':
       #call put() function as required

你也可以通过这个说明。

http://code.google.com/appengine/docs/python/tools/webapp/requesthandlerclass.html#RequestHandler_put

答案 1 :(得分:2)

HTML规范不允许表单使用DELETE方法,您可能无法让浏览器发送带有表单的HTTP DELETE请求。 RequestHandler子类的delete()方法通常用于RESTful Web应用程序,其客户端知道如何发送DELETE请求,而不是使用普通的HTML表单。 (对于基于浏览器的客户端,您可以使用XMLHttpRequest在javascript中发送DELETE请求。)

答案 2 :(得分:0)

你当然可以自己实现这个模拟,在伪代码中(我不熟悉GAE细节):

def post(self):
    if request.get('_method', '') == 'delete':
        return self.post()

如果你想真正测试PUT和DELETE,你必须找到一种方法来实际使用这些方法而不是模拟它们。你可以使用curl,例如,即

$ curl -X DELETE url
$ curl -T file url # for PUT

有关详细信息,请参阅curl文档/联机帮助页。

答案 3 :(得分:0)

首先,您需要创建一个新的RequestHandler子类:

from google.appengine.ext import webapp

class RESTfulHandler(webapp.RequestHandler):
  def post(self, *args):
    method = self.request.get('_method')

    if method == "put":
      self.put(*args)
    elif method == "delete":
      self.delete(*args)
    else:
      self.error(405) # Method not allowed

然后你的处理程序将继承它:

class MyHandler(RESTfulHandler):
  def get(self):
    ...
  def delete(self):
    ...
  def put(self):
    ...
  def post(self):
    ...

以下是使用大多数JavaScript库使用的X-HTTP-Method-Override标头的另一个示例: http://github.com/sork/webapp-handlers/blob/master/restful.py