Движок приложения Python поставить (самостоятельно):

1

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

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)
Теги:
google-app-engine

1 ответ

4
Лучший ответ

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

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

  • Если аргумент _method arg всегда будет параметром строки запроса, а не параметром опубликованной формы, вы можете использовать webapp.Request(environment).GET.get('method'), который не будет читать тело запроса.
  • Вы можете переопределить WSGIApplication. вызывать, чтобы изменить способ его отправки.
  • Вы можете подклассифицировать WSGIApplication и предоставить пользовательский REQUEST_CLASS, являющийся функцией, которая создает реальный объект запроса, а затем изменяет среду, которая была передана в соответствии с вами (взломать!).
  • Вы можете определить собственный базовый класс webapp RequestHandler, который реализует initialize(), доходит до объекта запроса WSGI dict и меняет метод (взломать!).
  • 0
    Не вопрос, но как мне скопировать тело запроса и вернуть его в среду WSGI?
  • 0
    Вам нужно сделать что-то вроде environ['wsgi.input'] = StringIO.StringIO(request.body)
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню