Путаница в 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)