如何在Python CGI脚本中引发HTTP错误/异常?
我该如何在Python CGI脚本中引发一个HTTP错误或异常呢?
只需要打印出合适的头部信息就可以了:
print '''Status: 501 Not Implemented
Content-type: text/html
'''
但这似乎不太管用。
我的设置非常简单,就是用IIS7把*.py的CGI脚本路由到python25.exe去执行。我没有使用任何WSGI或FastCGI,只是用“普通”的CGI模块:cgitb
和cgi
。
3 个回答
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 的。
在你的脚本开始时,先写上:cgitb.enable()
。然后在出现错误的时候,要输出正确的错误代码,可以使用:
try:
blah blah failed code
except:
print "Status: 500"
cgitb.handler()
看起来这就是正确的做法。只要你按照正确的格式来写头部信息就可以了。
这里有另一个人也问了差不多的问题。
你在打印状态码的时候,有遵循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:扩展回答