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)
È stato utile?

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!).
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top