python - Google App Engine 是否真的实现了 "normal"CGI?

标签 python google-app-engine cgi

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

这肯定是一个非常明显的问题,但我无法弄清楚。我是 Google App Engine 的新手,正在尝试使用它来运行旧的 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 -

最佳答案

经过研究和这里的一些答案(由于某种原因被删除),似乎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 的处理程序。

关于python - Google App Engine 是否真的实现了 "normal"CGI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19295153/

相关文章:

google-app-engine - 没有路由器 Gorilla Mux 的 Google Cloud Go 处理程序?

python - 如何删除 CGI 正在显示的临时文件(图像)?

C CGI程序: how to print dynamically?

python - 将 namedtuple 中的信息作为参数传递的更好方法

google-app-engine - 是否可以在不支付 Google Apps 费用的情况下配置 Google App Engine 自定义域?

javax.jdo.JDOFatalUserException : Illegal argument

linux - 带 CGI 的 Shell 脚本适用于 bash 但不适用于 sh

python - pyodbc 到 SQL Server 获取结果时太慢

python-jenkins get_job_info - 如何获取超过 100 个构建的信息?

python - 如何在Python中对对象进行deepequals