put Python App Engine (self):
-
20-09-2019 - |
Domanda
Sto usando questo middleware per rendere il mio app riposante, ma sembra che i miei parametri di forma non sono venuta attraverso:
from google.appengine.ext import webapp
class RestHTTPMiddleware(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
method = webapp.Request(environ).get('_method')
request = Request(environ)
environ['wsgi.input'] = StringIO.StringIO(request.body)
if method:
environ['REQUEST_METHOD'] = method.upper()
return self.app(environ, start_response)
Quando invio un form e il debug utilizzando:
def put(self):
logging.debug(self.request.get('description'))
il registratore è vuoto. Il metodo put (auto) viene chiamato, ho provato usando il registratore e viene mostrato il mio messaggio di debug.
2 ° revisione:
from google.appengine.ext import webapp
from webob import Request
import logging
import StringIO
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)
Ultime modifiche:
from google.appengine.ext import webapp
from webob import Request
import logging
import StringIO
class RestHTTPMiddleware(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
request = Request(environ)
body = StringIO.StringIO(request.body)
method = webapp.Request(environ).get('_method', None)
if method:
environ['REQUEST_METHOD'] = method.upper()
environ['wsgi.input'] = body
return self.app(environ, start_response)
Soluzione
istanziare webapp.Request e chiamando .get su di esso induce a leggere il corpo della richiesta e analizzare i parametri di forma in essa. Quando il vostro webapp attuale inizia più tardi, si crea un'istanza di un altro oggetto di richiesta, e ancora una volta cerca di leggere il corpo della richiesta -. Ma è già stata letta, quindi nulla viene restituito
Si potrebbe modificare il proprio middleware per memorizzare una copia del corpo della richiesta e rimetterlo in ambiente WSGI. Ci sono altre opzioni:
- Se l'arg _method sarà sempre un parametro di stringa di query al posto di un parametro di modulo pubblicato, è possibile utilizzare webapp.Request (environ) .GET.get ( 'metodo'), che non leggerà il corpo della richiesta.
- Si potrebbe sovrascrivere WSGIApplication. Chiama per cambiare come lo fa la spedizione.
- Si potrebbe sottoclasse WSGIApplication e fornire una personalizzato REQUEST_CLASS , essendo una funzione che costruisce un oggetto di richiesta vera e propria, quindi modifica l'ambiente che è stato passato in secondo le proprie esigenze (hackerare!).
- Si potrebbe definire una classe base RequestHandler webapp personalizzata che implementa l'inizializzazione (), raggiungendo per dict WSGI dell'oggetto richiesta e modificando il metodo (hackerare!).