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)
¿Fue útil?

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).
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top