Python AppEngine混淆-CGI,是否符合WSGI?

Python AppEngine混淆-CGI,是否符合WSGI?,python,google-app-engine,wsgi,wsgiref,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不包含列出为必须存

我很困惑

如果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不包含列出为必须存在的变量—导致wsgiref.util.request_uri引发一个KeyError


我基本上正在编写一些库,这些库需要使用AppEngine或典型的Apache+modwsgi设置。我原以为只需编写一个符合WSGI的应用程序就足够了,但似乎是AppEngine本身。。不是吗?

AFAIK pep 333没有提到将所有wsgi环境变量强制放入os.environ,除非模拟CGI,只是wsgi环境变量应该包含这些内容

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

AFAIK pep 333没有提到将所有wsgi环境变量强制放入os.environ,除非模拟CGI,只是wsgi环境变量应该包含这些内容

在wsgi应用程序的上下文中,环境字典是传递给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)
必须包含wsgi特定键的环境是传递给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环境

class MainPage(webapp.RequestHandler):
    def get(self):
        dosomethingwith(self.request.environ)
必须包含wsgi特定键的环境是传递给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环境

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

请注意,当App Engine Python运行时获得并发支持时,os.environ将变得特别不可信,因为它可能包含来自另一个线程提供的请求的数据。一般来说,对于从何处获得环境,pep-333会做出一些选择,以实现高度并发,wsgi服务器可能会在同一进程多线程甚至同一线程中异步交叉交互多个请求,尽管我知道在野外没有真正的服务器会进行第二个交互,这一事实在许多框架的设计中都无法实现,在任何情况下都不是异步安全的。请注意,当App Engine Python运行时获得并发支持时,os.environ将变得特别不可信,因为它可能包含来自另一个线程服务的请求的数据。一般来说,对于从何处获得环境,要非常迂腐,pep-333做出了一些能够实现高度并发的选择,wsgi服务器可能会在同一进程中以多线程甚至同一线程异步方式交错交互多个请求,尽管我知道在野外没有真正的服务器可以进行第二个交互,而这一事实已经躲过了许多框架的设计,在任何情况下都不是异步安全的。