2010-09-18 3 views
7

Dans GAE Python, je pourrais utiliserComment utiliser supprimer() dans le gestionnaire de requêtes de Google App Engine Python

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

Pour gérer GET et POST demande. Mais comment puis-je gérer DELETE et PUT? Je vois delete() et put() dans la documentation API, mais je ne sais pas comment écrire un formulaire pour simuler DELETE et PUT.

Je sais que dans Rails, je peux utiliser la méthode post avec un champ caché sous une forme pour simuler les demandes similaires:

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

et poignées Rails les travaux sales automatiquement.

Existe-t-il une façon similaire de le faire dans GAE python?

J'ai cherché ceci dans Google, mais pas de chance.

Merci.

Répondre

6

Vous pouvez utiliser la méthode request qui accepte toutes les méthodes comme get, post, delete et put. Ensuite, vous pouvez le vérifier pour le type de demande en conséquence.

Vérifiez ceci:

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 

vous pouvez passer par cela aussi bien pour la spécification de vente.

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

+0

Merci, cela peut être une autre solution pour gérer les requêtes HTTP autres que GET et POST. Mais je ne sais toujours pas comment utiliser la méthode delete() fournie par App Engine. Vous savez, la méthode delete() devrait exister pour une raison quelconque, ou peut-être que le moteur de l'application a déjà une solution pour simuler une requête DELETE. Mais je ne sais pas. – venj

+0

Voir ma mise à jour si elle peut vous aider. –

0

Vous pouvez mettre en œuvre cette simulation vous bien sûr, en pseudo-code (je ne suis pas au courant des détails GAE):

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

Si vous voulez vraiment tester PUT et DELETE vous devrez trouver un moyen pour utiliser réellement ces méthodes au lieu de les simuler. Vous pouvez utiliser cette boucle pour, par exemple, à savoir

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

Voir la documentation/manpage boucle pour plus d'informations.

+0

Than k vous pour votre réponse. Cela peut être l'un des moyens de traiter la requête HTTP DELETE.Mais je me demandais, comment puis-je vraiment utiliser la méthode delete() qui est fournie par l'API Google App Engine. – venj

2

La spécification HTML ne permet pas une forme d'utiliser la méthode SUPPRIMER, et vous pouvez probablement pas obtenir un navigateur pour envoyer une demande avec HTTP SUPPRIMER un formulaire. La méthode delete() d'une sous-classe RequestHandler serait généralement utilisée pour une application web RESTful avec un client qui sait comment envoyer des requêtes DELETE, plutôt que d'utiliser des formulaires HTML ordinaires. (Pour un client basé sur un navigateur, vous pouvez envoyer des demandes de suppression dans javascript en utilisant XMLHttpRequest.)

0

D'abord, vous devez créer une nouvelle sous-classe 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 

Ensuite, votre gestionnaire héritera de celui-ci:

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

Voici un autre exemple en utilisant l'en-tête HTTP X-méthode-Override utilisée par la plupart des bibliothèques JavaScript: http://github.com/sork/webapp-handlers/blob/master/restful.py

+0

qu'en est-il des demandes de publication réelles? ne devriez-vous pas appeler self.post (* args) au lieu de self.error() au cas où l'enfant implémente post()? – arkanciscan

Questions connexes