Pergunta

Estou usando este middleware para tornar meu aplicativo repousante, mas parece que meus parâmetros de formulário não estão chegando:

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 eu envio um formulário e o depuração usando:

def put(self):
    logging.debug(self.request.get('description'))

O madeireiro está vazio. O método put (self) está sendo chamado, eu o testei usando o logger e minha mensagem de depuração é mostrada.

2ª revisão:

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)

As últimas alterações:

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

Solução

Instantando o WebApp.Request e o chamado .Genha -o faz com que ele leia os parâmetros do corpo e analise o formulário. Quando o seu aplicativo real começa mais tarde, ele instancia outro objeto de solicitação e mais uma vez tenta ler o corpo da solicitação - mas já foi lido, para que nada seja devolvido.

Você pode modificar seu middleware para armazenar uma cópia do corpo da solicitação e colocá -lo de volta no ambiente do WSGI. Existem outras opções:

  • Se o _Method Arg sempre for um parâmetro de sequência de consulta em vez de um parâmetro de formulário publicado, você poderá usar o webapp.request (Environ) .get.get ('método'), que não lerá o corpo da solicitação.
  • Você pode substituir Wsgiapplication.ligar Para alterar como é despacho.
  • Você pode subclasse a WSgiapplication e fornecer um costume Request_class, sendo uma função que cria um objeto de solicitação real e modifica o ambiente que foi passado para se adequar a você (hack!).
  • Você pode definir uma classe Base de solicitação de solicitação de solicitação personalizada que implementa inicialize (), alcançando o ditado WSGI do objeto de solicitação e alterando o método (hack!).
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top