Question

J'utilise ce middleware pour faire mon application reposant, mais il semble que mes paramètres de formulaire ne viennent pas par:

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)

lorsque je soumets un formulaire et le débogage en utilisant:

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

l'enregistreur est vide. La méthode mis (auto) est appelé, je l'ai testé à l'aide de l'enregistreur et mon message de débogage est affiché.

2ème révision:

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)

Dernières modifications:

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)
Était-ce utile?

La solution

instanciation webapp.Request et appelant .get sur elle l'amène à lire le corps de la demande et analyser les paramètres de formulaire en elle. Lorsque votre webapp réelle commence plus tard, il instancie un autre objet de la demande, et une fois essaie de lire le corps de la demande -. Mais il a déjà été lu, donc rien est retourné

Vous pouvez modifier votre middleware pour stocker une copie du corps de la demande et la remettre dans l'environnement WSGI. Il y a d'autres options:

  • Si le arg _method sera toujours un paramètre de chaîne de requête au lieu d'un paramètre de forme affiché, vous pouvez utiliser webapp.Request (environ) .GET.get ( « méthode »), qui ne lit pas le corps de la demande.
  • Vous pourriez remplacer WSGIApplication. appel pour changer la façon dont il fait l'expédition.
  • Vous pouvez sous-classe WSGIApplication et de fournir une coutume REQUEST_CLASS , étant une fonction qui construit un véritable objet de requête, puis modifie l'environnement qui a été adoptée pour vous convient (pirater!).
  • Vous pouvez définir une classe de base RequestHandler webapp personnalisée qui implémente l'initialisation (), atteignant pour la dict WSGI de l'objet de la requête et changer la méthode (pirater!).
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top