1

我很困惑。

如果 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()引发 a KeyError

我基本上是在编写一些需要在 AppEngine 或典型的 Apache + modwsgi 设置中工作的库。我认为只需编写一个兼容的应用程序就足够了WSGI,但似乎 AppEngine 本身......不是吗?

4

2 回答 2

4

其中environ必须包含 wsgi 特定键的是传递给 wsgi 应用程序可调用的环境。PEP-333 不要求这是 value os.environ。CGI 应用程序会发现很多键都在 中os.environ,因为网关服务器已经提供了它们,而 cgi 到 wsgi 网关接口(例如,,wsgiref.handlers.CGIHandler)只需要在调用 wsgi 应用程序之前添加 wsgi 特定的键。

需要明确的是,当 PEP-333 提到environ时,并不意味着 os.environ.

编辑:google.appengine.ext.webapp.Request显然继承自webob.Request. environ因此,webapp 处理程序可以像这样访问 wsgi 。

class MainPage(webapp.RequestHandler):
    def get(self):
        dosomethingwith(self.request.environ)
于 2011-07-11T15:44:58.823 回答
1

AFAIK pep 333 没有说明强制所有 wsgi 环境变量进入os.environ,除非模拟 CGI,只是 wsgi 环境变量应该包含这些东西。

在 wsgi 应用程序的上下文中,环境字典是传递给 wsgi 应用程序函数的部分。在 GAE 中,您可以通过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)
于 2011-07-11T15:37:05.253 回答