Frage

Ich bin mit dieser Middleware zu meinem app erholsamen, aber es sieht aus wie meine Form Parameter nicht kommen durch:

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)

, wenn ich senden Sie eine Form und die Debug es mit:

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

ist der Logger leer. Die Put (Selbst-) Methode aufgerufen wird, ich habe es getestet mit dem Logger und meine Debug-Meldung angezeigt wird.

2. Änderung:

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)

Letzte Änderungen:

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)
War es hilfreich?

Lösung

Instanziieren webapp.Request und ruft .get auf, um es bewirkt, dass die Anfrage Körper und Parse-Formularparameter darin zu lesen. Wenn Ihre tatsächlichen Webapp später beginnt, es instanziiert eine weitere Anfrage-Objekt, und einmal versucht erneut die Anforderung Körper zu lesen -. Aber es ist schon gelesen worden sind, so dass nichts zurückgegeben

könnten Sie ändern Ihre Middleware eine Kopie des Antrags Körper zu speichern und in der WSGI Umgebung zurückstellen. Es gibt andere Optionen:

  • Wenn die _method arg wird immer anstelle eines Gesendete Formparameter eine Abfrage-String-Parameter, können Sie webapp.Request (environ) .GET.get ( ‚Methode‘) verwenden, die den Anforderungstext nicht gelesen werden.
  • Sie könnten außer Kraft setzen WSGIApplication. Anruf ändern, wie es funktioniert Versand.
  • Sie könnten WSGIApplication Unterklasse und liefern eine benutzerdefinierte REQUEST_CLASS , eine Funktion, die ein echtes Request-Objekt erstellt, modifiziert dann die Umgebung, die in übergeben wurde zum Anzug (Hack!).
  • Sie können eine benutzerdefinierte Webapp Requestbasisklasse definieren, dass Geräte initialisieren () und erreichte in der Aufforderung des Objekts WSGI dict und die Änderung der Methode (Hack!).
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top