Как добавить в AppEngine промежуточное программное обеспечение WSGI, которое изменяет тело ответа - PullRequest
2 голосов
/ 10 декабря 2010

Добавить промежуточное ПО, которое только изменяет заголовки HTTP (например, FirePython), довольно просто, но когда вы вызываете webapp.WSGIApplication (environment, start_response), он возвращает [''] вместо итерируемого с телом:

def __call__(self, environ, start_response):
    ...
    response.wsgi_write(start_response)
    return ['']

response.wsgi_write фактически отвечает за печать тела:

def wsgi_write(self, start_response):
    ...
    write = start_response('%d %s' % self.__status, self.__wsgi_headers)
    write(body)
    self.out.close()

Это затрудняет модификацию тела с помощью промежуточного программного обеспечения WSGI. Обычно я бы просто сделал:

class Upperware:
    def __init__(self, app):
        self.wrapped_app = app

def __call__(self, environ, start_response):
    for data in self.wrapped_app(environ, start_response):
        return data.upper()

Но это не работает, так как возвращаемое значение wrapped_app равно ['']. Как заставить промежуточное ПО Upperware работать в Google AppEngine? Какое дизайнерское решение привело к написанию ответа вместо его возврата?

1 Ответ

3 голосов
/ 13 декабря 2010

Если вы хотите перехватить записи в теле запроса, вам нужно определить свои собственные функции start_response и write, например:

class Upperware(object):
  def __init__(self, app):
    self.wrapped_app = app

  def __call__(self, environ, start_response):
    def my_start_response(status, response_headers, exc_info=None):
      write = start_response(status, response_headers, exc_info)
      def my_write(body_data):
        # Do your middleware handling of writes here
        body_data = body_data.upper()
        write(body_data)
      return my_write
    return self.wrapped_app(environ, my_start_response)

Что касается того, почему веб-приложение было написано таким образом, я боюсь, что не могу сказать. Должна быть возможность изменить его поведение, чтобы получить итератор или список, не нарушая ничего, поэтому не стесняйтесь сообщить об ошибке .

...