2010-09-12 14 views
1

Comment puis-je transmettre le corps de la requête à mes vues?google app engine _method?

class RestHTTPMiddleware(object): 
    def __init__(self, app): 
    self.app = app 

    def __call__(self, environ, start_response): 
    request = Request(environ) 
    environ['wsgi.input'] = StringIO.StringIO(request.body) 

    method = webapp.Request(environ).get('_method') 

    if method: 
     environ['REQUEST_METHOD'] = method.upper() 

    return self.app(environ, start_response) 

quand je test:

def put(self): 
    logging.info("spot put %s", self.request.get("name")) 

ce qui suit est enregistré: "spot mis" mais sans valeur.

Voici comment cela est mis en œuvre:

def main(): 
    app = webapp.WSGIApplication([ 
    (r'/spot/new/$', Spot), 
    ], 
    debug=True) 
    # run_wsgi_app(application) 
    wsgiref.handlers.CGIHandler().run(RestHTTPMiddleware(app)) 
+0

Pourquoi essayez-vous de faire cela? Pourquoi ne pas simplement accéder à self.request.body? –

+0

Je veux pouvoir utiliser les méthodes put() et delete() dans webapp, un moyen de le faire est d'utiliser le dans les formulaires –

+0

S'il s'agit d'une entrée [type = hidden], cela signifie que vous définissez sa valeur dans le code. Définissez la méthode appropriée comme '

' à la place. – Xion

Répondre

0

Vous y êtes presque avec ce code, je pense. Avez-vous essayé et voir si cela fonctionne si vous exécutez fp.seek(0) après la création de l'instance de demande?

Je devrais également noter que c'est un hack dangereux! Cela me permet de tromper votre serveur Web en lui faisant croire qu'un <img src="http://yourserver.com/?_method=POST&delete_account=1"> est une demande POST légitime de l'utilisateur qui consulte mon site. En clair: c'est dangereux du point de vue de la sécurité. Ne le faites pas à moins d'être certain que vous avez d'autres mécanismes qui contrecarrent la boîte de cauchemars de CSRF de Pandore.