AppEngine混淆 - CGI,WSGI兼容?

时间:2011-07-11 15:20:59

标签: python google-app-engine wsgi wsgiref

我很困惑。

如果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列为必须 -be-present的变量 - 导致wsgiref.util.request_uri()引发KeyError 1}}?

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

2 个答案:

答案 0 :(得分:4)

必须包含wsgi特定键的environ是传递给wsgi应用程序可调用的environ。 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。因此,webapp处理程序可以访问wsgi environ之类的东西。

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

答案 1 :(得分:1)

AFAIK pep 333没有说明将所有wsgi环境变量强制转换为os.environ,除非模拟CGI,只是wsgi environ变量应包含这些内容。

在wsgi应用程序的上下文中,environ字典是传递给wsgi应用程序函数的部分。在GAE中,您可以通过request.environ访问wsgi环境字典。所以我认为你的代码应该更像:

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