不使用CGI模块的Python CGI脚本?
有没有可能在不使用CGI模块的情况下,用Python作为CGI,还能获取到浏览器的所有信息和其他内容呢?
我试过:
#!/usr/bin/python
import sys
print "Content-type: text/html"
print
data = sys.stdin.readlines()
print len(data)
但是它总是输出0。
2 个回答
2
当然可以。cgi
是一个工具模块,没有什么神奇的功能;它做的事情其实你自己也能做到,只需要读取和处理一些环境变量(特别是 QUERY_STRING
)和 stdin
,后者在处理 POST
表单数据时会用到。(不过要记得读取 CONTENT_LENGTH
这个环境变量,只读取那么多字节,而不是用 readlines()
,否则你的脚本可能会一直等待更多输入,而这些输入是永远不会来的。)
实际上,有很多完全可以替代 cgi
的方法来处理表单提交,要么是独立的模块,要么是框架的一部分。
不过,不管有没有 cgi
模块,我今天不会写一个完全基于 CGI 的网页应用。更好的做法是写一个符合 WSGI 接口的应用,然后用 wsgiref.handlers.CGIHandler
来通过 CGI 部署这个 WSGI 应用。这样的话,你可以在需要的时候轻松迁移到更高效的网络服务器接口。如果你愿意,可以在 WSGI 应用中使用 cgi
模块来读取表单提交,或者你也可以选择自己实现。
3
确实可以这样做,但很多信息是通过环境变量传递的,而不是通过标准输入。实际上,标准输入中传递的唯一内容是传入请求的主体,只有在提交表单时,这个主体才会有内容。
想了解更多关于CGI的工作方式,可以查看像 http://www.w3.org/CGI/ 这样的网站。(在这里解释整个标准内容太多了)