2010-09-18 30 views
7

En GAE Python, que podría utilizarCómo utilizar el método delete() en el controlador de solicitudes de Google App Engine Python

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

Manejar GET y solicitud POST. ¿Pero cómo puedo manejar DELETE y PUT? Veo delete() y put() en la documentación de API, pero no sé cómo escribir un formulario para simular DELETE y PUT.

Sé que en los carriles, puedo utilizar el método post con un campo oculto en forma de simular las demandas como éste:

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

y rieles se ocupa de los trabajos sucios de forma automática.

¿Hay alguna manera similar de hacerlo en GAE python?

He buscado esto en Google, pero no tuve suerte.

Gracias.

Respuesta

6

Puede usar el método de solicitud que acepta todos los métodos como get, post, delete y put. Luego puede verificar el tipo de solicitud en consecuencia.

Comprobar esto:

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 

se puede ir a través de este, así como para la especificación de venta.

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

+0

Gracias, esta puede ser otra solución para manejar solicitudes HTTP distintas de GET y POST. Pero todavía no sé cómo usar el método delete() proporcionado por App Engine. Ya sabes, el método delete() debería existir por alguna razón, o tal vez el motor de la aplicación ya tiene una solución para simular la solicitud DELETE. Pero no sé – venj

+0

Ver mi publicación actualizada si puede ser útil. –

0

Puede implementar esta simulación usted mismo, por supuesto, en pseudo código (no estoy familiarizado con detalles GAE):

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

Si desea verdaderamente PUT y DELETE prueba que tendrá que encontrar una manera de usar realmente estos métodos en lugar de simularlos. Se puede utilizar para este rizo, por ejemplo, es decir

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

Ver el rizo documentación/página de manual para más información.

+0

Que k tu por tu respuesta. Esta puede ser una de las formas de lidiar con la solicitud HTTP DELETE.Pero me preguntaba, ¿cómo puedo usar realmente el método delete() proporcionado por la API de Google App Engine? – venj

2

especificación El HTML no permite una forma de utilizar el método Delete, y es probable que no se puede conseguir un navegador para enviar una solicitud DELETE HTTP con una forma. El método delete() de una subclase RequestHandler generalmente se usaría para una aplicación web RESTful con un cliente que sepa cómo enviar solicitudes DELETE, en lugar de utilizar formularios HTML normales. (Para un cliente basado en navegador, puede enviar solicitudes de eliminación en JavaScript utilizando XMLHttpRequest.)

0

En primer lugar, es necesario crear una nueva subclase 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 

A continuación, el controlador heredarán de ella:

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

Aquí es otro ejemplo usando la cabecera X-HTTP-Method-Override utilizado por la mayoría de las bibliotecas de JavaScript: http://github.com/sork/webapp-handlers/blob/master/restful.py

+0

¿qué hay de las solicitudes de publicaciones reales? ¿no deberías llamar a self.post (* args) en lugar de self.error() en caso de que el niño implemente post()? – arkanciscan