繁体   English   中英

AppEngine 混乱 - CGI,WSGI 兼容?

[英]AppEngine confusion - CGI, WSGI-compliant?

我很困惑。

如果 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 本身..不是吗?

必须包含environ特定键的环境是传递给 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 因此,webapp 处理程序可以像这样访问 wsgi environ

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM