Путаница в AppEngine - CGI, WSGI-совместимый? - PullRequest
1 голос
/ 11 июля 2011

Я в замешательстве.

Если 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 выводится как must -be-present - заставляя wsgiref.util.request_uri() поднять KeyError?

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

Ответы [ 2 ]

4 голосов
/ 11 июля 2011

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)
1 голос
/ 11 июля 2011

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