如何在Python CGI脚本中引发HTTP错误/异常?

4 投票
3 回答
5543 浏览
提问于 2025-04-15 15:30

我该如何在Python CGI脚本中引发一个HTTP错误或异常呢?

只需要打印出合适的头部信息就可以了:

print '''Status: 501 Not Implemented
Content-type: text/html

'''

但这似乎不太管用。

我的设置非常简单,就是用IIS7把*.py的CGI脚本路由到python25.exe去执行。我没有使用任何WSGI或FastCGI,只是用“普通”的CGI模块:cgitbcgi

3 个回答

0

Python CGI 返回 HTTP 状态码,比如 403?

其中一个回答提到:

sys.stdout('状态: 403 禁止访问\r\n\r\n')

根据 RFC 的规定,这样做在技术上可能更正确(假设你的 CGI 脚本不是在 Windows 的文本模式下运行)。不过这两种换行方式似乎在任何地方都能正常工作。

但是因为你是在 Windows 上操作,并且没有用状态行结束头部...

sys.stdout('Status: 501 Not Implemented\n')

我不明白为什么使用 sys.stdout 会有区别,因为 print 应该是使用 stdout 的。

3

在你的脚本开始时,先写上:cgitb.enable()。然后在出现错误的时候,要输出正确的错误代码,可以使用:

try:
  blah blah failed code
except:
  print "Status: 500"
  cgitb.handler()
3

看起来这就是正确的做法。只要你按照正确的格式来写头部信息就可以了。

这里有另一个人也问了差不多的问题。

在Python CGI中返回HTTP状态码

你在打印状态码的时候,有遵循HTTP的规范吗?能不能试着只打印状态码,而不打印它的描述信息呢?

可能像这样……

print '''Status:501
Content-type: text/html

'''

或者应该像这样……

print '''HTTP/1.1 501 Not Implemented
Content-type: text/html

'''

你能用你的设置来测试一下,确认一下吗?

从CGI返回状态:

http://oreilly.com/openbook/cgi/ch03_07.html

我觉得“Status: 501 Not Implemented”就像你最开始写的那样是对的。我不知道为什么它不工作。你在打印状态码之前,有没有打印其他非头部的内容呢?

还有另一个来源确认你做得对(看第6.3.3节):

http://www.ietf.org/rfc/rfc3875

编辑 1,2,3:扩展回答

撰写回答