Движок приложения Python put(self):
-
20-09-2019 - |
Вопрос
Я использую это промежуточное программное обеспечение, чтобы сделать мое приложение спокойным, но похоже, что параметры моей формы не проходят:
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 объекта запроса и изменяя метод (взломайте!).