Python app engine put(self):

时间:2010-03-17 07:11:32

标签: python google-app-engine

我正在使用这个中间件让我的应用程序变得安静,但看起来我的表单参数没有通过:

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)

1 个答案:

答案 0 :(得分:4)

实例化webapp.Request并在其上调用.get使其读取请求主体并解析其中的表单参数。当您的实际webapp稍后启动时,它会实例化另一个请求对象,并再次尝试读取请求正文 - 但它已被读取,因此不会返回任何内容。

您可以修改中间件以存储请求正文的副本并将其放回WSGI环境中。还有其他选择:

  • 如果_method arg始终是查询字符串参数而不是已发布的表单参数,则可以使用webapp.Request(environ).GET.get('method'),它不会读取请求正文。< / LI>
  • 您可以覆盖WSGIApplication.call以更改其发送方式。
  • 您可以继承WSGIApplication并提供自定义REQUEST_CLASS,这是一个构建实际请求对象的函数,然后修改传入的环境以适合您(黑客!)。
  • 您可以定义一个自定义webapp RequestHandler基类来实现initialize(),进入请求对象的WSGI dict并更改方法(hack!)。