Вопрос

Я использую это промежуточное программное обеспечение, чтобы сделать мое приложение спокойным, но похоже, что параметры моей формы не проходят:

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)

когда я отправляю форму и выполняю ее отладку, используя:

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

регистратор пуст.Вызывается метод put(self), я протестировал его с помощью регистратора, и отображается мое отладочное сообщение.

2-я редакция:

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)

Последние изменения:

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)
Это было полезно?

Решение

Создание экземпляра webapp.Request и вызов .get для него приводит к чтению тела запроса и анализу параметров формы в нем.Когда ваше фактическое веб-приложение запускается позже, оно создает экземпляр другого объекта запроса и еще раз пытается прочитать тело запроса, но оно уже прочитано, поэтому ничего не возвращается.

Вы можете изменить свое промежуточное программное обеспечение, чтобы сохранить копию тела запроса и вернуть ее в среду WSGI.Есть другие варианты:

  • Если аргумент _method всегда будет параметром строки запроса, а не опубликованным параметром формы, вы можете использовать webapp.Request(environ).GET.get('method'), который не будет читать тело запроса.
  • Вы могли бы переопределить Приложение WSGIA.вызов чтобы изменить способ отправки.
  • Вы можете создать подкласс WSGIpplication и предоставить собственный REQUEST_CLASS, являющаяся функцией, которая создает реальный объект запроса, а затем изменяет переданную среду в соответствии с вашими предпочтениями (взломайте!).
  • Вы можете определить собственный базовый класс RequestHandler веб-приложения, который реализует инициализацию(), обращаясь к диктовке WSGI объекта запроса и изменяя метод (взломайте!).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top