2010-09-18 8 views
7

In GAE Python, ho potuto utilizzareCome utilizzare il metodo delete() nel gestore richiesta di Google App Engine Python

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

Per gestire GET e POST richiesta. Ma come posso gestire DELETE e PUT? Vedo delete() e put() nella documentazione API, ma non so come scrivere un modulo per simulare DELETE e PUT.

So in Rails, posso utilizzare il metodo post con un campo nascosto in forma per simulare le domande come questa:

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

e Rails gestisce i lavori sporchi automaticamente.

C'è un modo simile per farlo in GAE python?

Ho cercato questo in Google, ma senza fortuna.

Grazie.

risposta

6

È possibile utilizzare il metodo di richiesta che accetta tutti i metodi come get, post, delete e put. Quindi è possibile controllarlo di conseguenza per il tipo di richiesta.

Controllare questo:

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 

si può passare attraverso questo pure per la specifica put.

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

+0

Grazie, questa potrebbe essere un'altra soluzione per gestire richieste HTTP diverse da GET e POST. Ma ancora non so come usare il metodo delete() fornito da App Engine. Sai, il metodo delete() dovrebbe esistere per qualche motivo, o forse il motore dell'app ha già una soluzione per simulare la richiesta DELETE. Ma non lo so. – venj

+0

Vedere il mio post aggiornato se può aiutarti. –

0

È possibile implementare questa simulazione da soli, naturalmente, in pseudo-codice (io non sono a conoscenza specifiche GAE):

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

Se si vuole veramente messo prova e DELETE si dovrà trovare un modo utilizzare effettivamente questi metodi invece di simularli. È possibile usare curl per questo, per esempio, vale a dire

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

Vedere il ricciolo di documentazione/pagina di manuale per ulteriori informazioni.

+0

Than per la tua risposta Questo potrebbe essere uno dei modi per gestire la richiesta DELETE HTTP.Ma mi stavo chiedendo, come posso davvero utilizzare il metodo delete() fornito dall'API di Google App Engine. – venj

2

specifica Il codice HTML non consente a un modulo per utilizzare il metodo DELETE, e probabilmente non può ottenere un browser per inviare una HTTP DELETE richiesta con un modulo. Il metodo delete() di una sottoclasse RequestHandler viene generalmente utilizzato per un'applicazione web RESTful con un client che sa come inviare richieste DELETE, anziché utilizzare moduli HTML ordinari. (Per un client basato su browser, è possibile inviare richieste DELETE in JavaScript utilizzando XMLHttpRequest.)

0

In primo luogo, è necessario creare una nuova sottoclasse 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 

Allora il vostro gestore erediteranno da esso:

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

Ecco un altro esempio utilizzando l'intestazione X-HTTP-Metodo-override utilizzato dalla maggior parte delle librerie JavaScript: http://github.com/sork/webapp-handlers/blob/master/restful.py

+0

e per le reali richieste di posta? non dovresti chiamare self.post (* args) invece di self.error() nel caso in cui il figlio implementi post()? – arkanciscan

Problemi correlati