我使用这种中间做我的应用程序的宁静,但是它看起来像我的形成的参数并不是通过:

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'))

该记录器是空的。把(自我)的方法是正在叫,我已经测试了它的使用记录仪和我的"调试"的信息。

第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)
有帮助吗?

解决方案

实例,网络应用程序.请求和呼吁。得到它会导致它的阅读体请求和分析的形式参数。当你的实际网络应用程序开始后,它实例化的另一个请求对象,并再次试图读取所请求的主体,但已经阅读,所以没有返回。

你可以修改你的中间储存的副本的要求身体,并把它放回过环境。还有其它的选择:

  • 如果_method arg将永远是一个的查询串的参数,而不是一张贴的形式参数,可以使用网络应用程序.请求(environ).得到的。获得('方法'),不会阅读的要求的身体。
  • 你可以重写 WSGIApplication.呼叫 改变怎样它不会派遣。
  • 你可以类WSGIApplication并提供一个定制的 REQUEST_CLASS, ,作为一个功能,建立一个真正的请求对象,然后修改的环境中传递到适合你的(黑客!).
  • 你可以定义的一个定制网络应用程序RequestHandler基类实现了初始化()达到在请求对象的过字典和不断变化的方法(哈克!).
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top