Движок приложения Python поставить (самостоятельно): - PullRequest
1 голос
/ 17 марта 2010

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

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)

1 Ответ

4 голосов
/ 19 марта 2010

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

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

  • Если аргумент _method всегда будет параметром строки запроса, а не параметром опубликованной формы, вы можете использовать webapp.Request (environment) .GET.get ('method'), который не будет читать тело запроса.
  • Вы можете переопределить WSGIApplication. вызов , чтобы изменить способ отправки.
  • Вы можете создать подкласс WSGIApplication и предоставить пользовательский REQUEST_CLASS , являющийся функцией, которая создает реальный объект запроса, а затем изменяет среду, которая была передана в соответствии с вашими потребностями (хак!).
  • Вы можете определить пользовательский базовый класс веб-приложения RequestHandler, который реализует initialize (), достигая указаний WSGI объекта запроса и изменяя метод (хак!).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...