Python app Engine Put (self):
-
20-09-2019 - |
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)
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!).