题
我使用这种中间做我的应用程序的宁静,但是它看起来像我的形成的参数并不是通过:
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基类实现了初始化()达到在请求对象的过字典和不断变化的方法(哈克!).
不隶属于 StackOverflow