【问题标题】:AppEngine confusion - CGI, WSGI-compliant?AppEngine 混乱 - CGI,WSGI 兼容?
【发布时间】:2011-07-11 15:20:59
【问题描述】:

我很困惑。

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

【问题讨论】:

    标签: python google-app-engine wsgi wsgiref


    【解决方案1】:

    必须包含 wsgi 特定键的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)
    

    【讨论】:

    • 请注意,当 App Engine Python 运行时获得并发支持时,os.environ 将变得特别不可信,因为它可能包含来自另一个线程服务的请求的数据。
    • 作为一般规则,对于你从哪里获得environ 非常迂腐,pep-333 做出了一些启用高度并发的选择,wsgi 服务器可能会在同一个请求中交错交互进程(多线程)甚至在同一个线程中(异步),尽管我知道在野外没有真正的服务器可以执行第二个,而且这一事实已经避开了许多框架的设计,这些框架在任何方面都不是异步安全的.
    【解决方案2】:

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

    在 wsgi 应用程序的上下文中,环境字典是传递给 wsgi 应用程序函数的部分。在 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)
    

    【讨论】:

      猜你喜欢
      • 2021-01-05
      • 2012-09-10
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      相关资源
      最近更新 更多