Я использую это промежуточное программное обеспечение, чтобы сделать мое приложение спокойным, но похоже, что мои параметры формы не проходят:
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), я проверил его с помощью регистратора, и мое сообщение отладки показано.
Вторая ревизия:
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 на нем заставляет его читать тело запроса и анализировать параметры формы. Когда ваш фактический webapp запускается позже, он создает экземпляр другого объекта запроса и снова пытается прочитать тело запроса - но он уже был прочитан, поэтому ничего не возвращается.
Вы можете изменить свое промежуточное программное обеспечение, чтобы сохранить копию тела запроса и вернуть его в среду WSGI. Существуют и другие варианты:
environ['wsgi.input'] = StringIO.StringIO(request.body)