Как использовать метод delete () в обработчике запросов Python Google App Engine - PullRequest
7 голосов
/ 18 сентября 2010

В GAE Python я мог бы использовать

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

для обработки запросов GET и POST.Но как мне справиться с DELETE и PUT?Я вижу delete () и put () в документации API, но я не знаю, как написать форму для имитации DELETE и PUT.

Я знаю в Rails, я могу использовать метод post со скрытым полемв форме для имитации запросов, таких как:

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

и Rails обрабатывает грязные работы автоматически.

Есть ли подобный способ сделать это в GAE Python?

Я искал это в Google, но не повезло.

Спасибо.

Ответы [ 4 ]

6 голосов
/ 18 сентября 2010

Вы можете использовать метод запроса, который принимает все методы, такие как 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

3 голосов
/ 19 сентября 2010

Спецификация HTML не позволяет форме использовать метод DELETE, и вы, вероятно, не можете заставить браузер отправлять HTTP-запрос DELETE с формой. Метод delete () подкласса RequestHandler обычно используется для веб-приложения RESTful с клиентом, который знает, как отправлять запросы DELETE, вместо использования обычных форм HTML. (Для клиента на основе браузера вы можете отправлять запросы DELETE в javascript, используя XMLHttpRequest.)

0 голосов
/ 21 сентября 2010

Сначала вам нужно создать новый подкласс 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):
    ...

Вот еще один пример использования X-HTTP-Заголовок метода-переопределения, используемый большинством библиотек JavaScript: http://github.com/sork/webapp-handlers/blob/master/restful.py

0 голосов
/ 18 сентября 2010

Конечно, вы можете реализовать это моделирование самостоятельно, в псевдокоде (я не знаком со спецификой 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 для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...