Путаница в AppEngine - CGI, WSGI-совместимый?

Я не совсем понимаю.

Если предполагается, что AppEngine позволяет запускать приложения, использующие WSGI.

# somewhere in a webapp.RequestHandler
env = dict(os.environ.items())
for key, value in env.items():
    self.response.out.write(key+': '+value+'<br/>')

req_uri = wsgiref.util.request_uri(env)

.. тогда почему env не содержит переменных, которые PEP 333 перечисляет как обязательные для присутствия, вызывая wsgiref.util.request_uri() поднять KeyError?

Я в основном пишу некоторые библиотеки, которые должны будут работать либо в AppEngine, либо в типичной установке Apache + modwsgi. Я думал, что будет достаточно просто написать WSGI совместимое приложение, но, кажется, сам AppEngine.. не так ли?

2 ответа

Решение

environ который должен содержать определенные ключи wsgi - это среда, передаваемая вызываемому приложению wsgi. PEP-333 не требует, чтобы это было значение os.environ, Приложения CGI обнаружат, что многие ключи будут в os.environпотому что сервер шлюза предоставил их, и интерфейс шлюза cgi-wsgi (скажем, wsgiref.handlers.CGIHandler,) нужно добавить только определенные ключи wsgi перед вызовом приложения wsgi.

Чтобы было ясно, когда PEP-333 упоминает environ, это не значит os.environ,

РЕДАКТИРОВАТЬ: google.appengine.ext.webapp.Request по-видимому, наследует от webob.Request, Таким образом, обработчик веб-приложения может получить доступ к wsgi environ как то так

class MainPage(webapp.RequestHandler):
    def get(self):
        dosomethingwith(self.request.environ)

AFAIK pep 333 ничего не говорит о принуждении всех переменных среды wsgi в os.environ если только не эмулировать CGI, только то, что переменная окружения wsgi должна содержать эти вещи.

В контексте приложения wsgi словарь окружения - это часть, которая передается в функцию приложения wsgi. В GAE вы можете получить доступ к окружению wsgi через request.environ, Поэтому я думаю, что ваш код должен быть больше похож на:

# somewhere in a webapp.RequestHandler
env = self.request.environ
for key, value in env.iteritems():
    self.response.out.write(key+': '+value+'<br/>')
req_uri = wsgiref.util.request_uri(env)
Другие вопросы по тегам