put motor de aplicación Python (auto):
-
20-09-2019 - |
Pregunta
Estoy usando este middleware para hacer mi aplicación reparador, pero parece que mis parámetros de formulario no están llegando a través de:
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)
cuando presente un formulario y el depurarlo usando:
def put(self):
logging.debug(self.request.get('description'))
el registrador está vacía. se llama el método put (auto), he probado usando el registrador y se muestra mi mensaje de depuración.
segunda revisión:
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)
Los últimos cambios:
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)
Solución
instanciar y llamar a webapp.Request .get en él hace que se lea el cuerpo de la petición y analizar parámetros de formulario en ella. Cuando su aplicación web real comienza más tarde, se crea una instancia de otra solicitud de objeto, y una vez más intenta leer el cuerpo de la petición -., Pero que ya se ha leído, por lo que no se devuelve nada
Usted puede modificar su middleware para almacenar una copia del cuerpo de solicitud y poner de nuevo en el entorno WSGI. Hay otras opciones:
- Si el arg _method siempre será un parámetro de cadena de consulta en lugar de un parámetro de formulario publicado, puede utilizar webapp.Request (Environ) .GET.get ( 'método'), que no va a leer el cuerpo de la petición.
- Usted podría anular WSGIApplication. llamada para cambiar la forma en que lo hace el envío.
- Usted podría subclase WSGIApplication y suministrar una costumbre REQUEST_CLASS , siendo una función que construye un objeto de la petición real, entonces modifica el ambiente que se aprobó en a su medida (piratear).
- Se podría definir una clase base RequestHandler aplicación web personalizada que implementa inicializar (), llegando a dict WSGI del objeto de la petición y cambiar el método (piratear).