Google App Engine是否实际实现了“正常”CGI?

时间:2013-10-10 11:58:16

标签: python google-app-engine cgi

主要文档页面claim that it does:“Python 2.7运行时支持WSGI标准和CGI标准以实现向后兼容。”

这一定是一个非常明显的问题,但我无法弄清楚。我是谷歌应用引擎的新手,我正在尝试使用它来运行旧的Python CGI应用。我在我的Linux系统上安装了SDK,并有一个app.yaml文件,上面写着:

application: your-app-id
version: 3
runtime: python27
api_version: 1
threadsafe: false

handlers:
- url: /.*
  script: members.py

脚本和必要文件位于google_appengine文件夹中名为sms-gae的文件夹中。我跑的时候

./dev_appserver.py sms-gae/

程序在我访问localhost:8080时运行,但输出显示在终端控制台而不是浏览器中。没有输出到浏览器。相同的应用程序在普通的Web服务器CGI环境中运行良好。

根据main GAE documentation,“App Engine收集请求处理程序脚本写入标准输出流的所有数据,然后等待脚本返回。当处理程序完成时,所有输出数据都是发送给用户。“

从我所看到的GAE Development Environment documentation - 以及more detail here - 我已经正确设置了它。有关使用CGI脚本的文档相当稀疏,也无法在Internet上找到有关此问题的任何内容。

输出如下:

INFO     2013-10-10 23:05:55,535 sdk_update_checker.py:245] Checking for updates to the SDK.
INFO     2013-10-10 23:05:56,838 sdk_update_checker.py:289] This SDK release is newer than the advertised release.
INFO     2013-10-10 23:05:57,181 api_server.py:138] Starting API server at: http://localhost:49954 
INFO     2013-10-10 23:05:57,225 dispatcher.py:168] Starting module "default" running at: http://localhost:8080
INFO     2013-10-10 23:05:57,241 admin_server.py:117] Starting admin server at: http://localhost:8000
Content-Type: text/html; charset= utf-8

[The Content-Type line comes from my script and is followed by its output]

INFO     2013-10-10 23:06:05,227 members.py:73] No userid or password supplied.
INFO     2013-10-10 23:06:05,262 module.py:599] default: "GET / HTTP/1.1" 200 -

1 个答案:

答案 0 :(得分:2)

经过研究和一些答案(由于某些原因删除),似乎 GAE实际上不支持CGI (或至少不支持普通“CGI”)。它们似乎意味着GAE接受使用CGI适配器运行的WSGI代码(有关示例,请参阅discussion here)。

但是,使用the trick given here以粗略的方式将CGI应用程序转换为WSGI相对容易。如果您将此代码添加到应用程序的底部,它将执行此操作,假设主代码是从函数mainfunc运行并且它响应get请求(否则可以定义类似的post方法):

import webapp2
import StringIO

class MainPage(webapp2.RequestHandler):
   def get(self):
     old_stdout = sys.stdout
     new_stdout = StringIO.StringIO()
     sys.stdout = new_stdout
     mainfunc()
     self.response.out.write(new_stdout.getvalue())
     sys.stdout = old_stdout

app = webapp2.WSGIApplication([('/', MainPage)],debug=True)

然后将app.yaml重定向到指向“members.app”(在我的情况下)作为所有URL的处理程序。