在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中有没有类似的方法呢?
我在谷歌搜索过这个,但没有运气。
感谢。
答案 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
你也可以通过这个说明。
答案 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