稍后注意:以下原始帖子中的问题已基本解决。
以下是背景:对于入门的comp sci课程,学生使用教师提供的服务器开发html和服务器端Python 2.7脚本。该服务器基于CGIHTTPRequestHandler,就像pointlessprogramming那样。当学生的html和脚本看起来正确时,他们会将这些文件移植到远程,缓慢的Apache服务器上。为何支持两台服务器?好吧,使用本地服务器进行的初始开发有利于减少网络问题以及对运行Apache的远程弱机器的依赖性。最终移植到正在运行Apache的机器可以发布他们的结果供其他人查看。
为了使本地开发最有用,本地服务器应该与Apache服务器非常相似。目前存在一个重要区别:Apache要求脚本使用包含content-type
的标头开始响应;如果脚本无法提供这样的标头,Apache会向客户端发送500错误(“内部服务器错误”),这个错误太通用了,无法帮助那些无法使用服务器日志的学生。 CGIHTTPRequestHandler没有强制要求。因此,学生编写与本地服务器一起使用的无标题脚本是很常见的,但在将文件复制到Apache服务器后会出现令人困惑的500错误。如果有一个版本的本地服务器检查content-type
标头并在没有标题时给出一个好的错误会很有帮助。
我寻求有关创建此类服务器的建议。我是Python的新手,也是编写服务器的人。以下是我遇到的问题,但任何有用的建议都将受到赞赏。
CGI标准是否需要content-type
标头?如果是这样,其他人可能会从这里的主要问题的答案中受益。此外,如果是这样,我绝望找到一种方法来禁用Apache的要求。也许CGI RFC的相关部分是第6.3.1节(CGI响应,内容类型):“如果返回实体主体,脚本必须在响应中提供Content-Type字段。”
要创建一个检查content-type
标头的本地服务器,或许我应该对CGIHTTPServer.CGIHTTPRequestHandler进行子类化,以使用为缺少标头发出错误的版本覆盖run_cgi()。我正在查看CGIHTTPServer.py __version__ = "0.4"
,它与Python 2.7.3一起安装。但是run_cgi()做了很多处理,所以复制它的所有代码有点没什么吸引力,只是为了添加几个调用头检查例程。有更好的方法吗?
如果对(2)的回答类似于“否,建议覆盖run_cgi()”,“我预计会编写一个调用所需脚本的版本,然后在发送该输出之前检查脚本的输出以查找标题给客户。现有的run_cgi()中有两个地方可以调用脚本:
3A。当在非Unix系统上执行run_cgi()时,脚本将使用Python的subprocess
模块执行。因此,脚本的标准输出将作为内存中的字符串提供,我可以在调用self.wfile.write
之前检查标题。这听起来不错吗?
3B。但是当在* nix系统上执行run_cgi()时,脚本由分叉进程执行。我认为孩子的stdout将直接写入self.wfile(我对此有点朦胧),所以我认为run_cgi()中的代码没有机会检查输出。啊。有什么建议吗?
如果建议分析脚本的输出,email.parser是识别是否有content-type
标题的标准方法吗?是否建议使用另一个标准模块?
是否有更合适的论坛来询问主要问题(“基于CGIHTTPRequestHandler的CGI服务器如何需要......”)?如果有一个比Stack Overflow更好的讨论编程问题的论坛似乎很奇怪,但我想任何事都有可能。
感谢您的帮助。