我很困惑。
如果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本身..不是吗?
答案 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)