1

稍后注意:以下原始帖子中的问题已基本解决。

这是背景:对于介绍性计算机科学课程,学生使用教师提供的服务器开发 html 和服务器端 Python 2.7 脚本。该服务器基于 CGIHTTPRequestHandler,就像pointlessprogramming中的服务器一样。当学生的 html 和脚本看起来正确时,他们会将这些文件移植到远程、缓慢的 Apache 服务器。为什么支持两台服务器?嗯,使用本地服务器进行初始开发的好处是减少了网络问题和对运行 Apache 的远程弱机器的依赖。最终移植到运行 Apache 的机器的好处是可以将结果发布给其他人查看。

为了使本地开发最有用,本地服务器应该与 Apache 服务器非常相似。目前有一个重要的区别:Apache 要求脚本以包含content-type;的标头开始其响应。如果脚本未能提供这样的标头,Apache 会向客户端发送 500 错误(“内部服务器错误”),这对于无法使用服务器日志的学生来说太笼统了。CGIHTTPRequestHandler 没有强加类似的要求。因此,学生编写与本地服务器一起工作的无头脚本是很常见的,但在将文件复制到 Apache 服务器后会出现令人困惑的 500 错误。拥有一个本地服务器版本来检查content-type标头并在没有标头时给出一个很好的错误会很有帮助。

我寻求有关创建这样一个服务器的建议。我是 Python 和编写服务器的新手。这是我遇到的问题,但任何有用的建议将不胜感激。

  1. content-typeCGI 标准是否需要标头?如果是这样,其他人可能会从这里主要问题的答案中受益。此外,如果是这样,我对找到禁用 Apache 要求的方法感到绝望。也许CGI RFC的相关部分是第 6.3.1 节(CGI 响应,内容类型):“如果返回实体主体,脚本必须在响应中提供内容类型字段。”

  2. 要创建一个检查content-type标头的本地服务器,也许我应该将 CGIHTTPServer.CGIHTTPRequestHandler 子类化,以使用为缺少标头发出错误的版本覆盖 run_cgi()。我正在查看__version__ = "0.4"与 Python 2.7.3 一起安装的 CGIHTTPServer.py 。但是 run_cgi() 做了很多处理,所以复制它的所有代码有点不吸引人,只是在头检查例程中添加几个调用。有没有更好的办法?

  3. 如果 (2) 的答案类似于“不,建议覆盖 run_cgi()”,我预计会编写一个调用所需脚本的版本,然后在将输出发送到客户端之前检查脚本的输出是否有标头。在调用脚本的现有 run_cgi() 中显然有两个地方:

    • 3a。在非 Unix 系统上执行 run_cgi() 时,使用 Python 的subprocess模块执行脚本。结果,脚本的标准输出将作为内存中的字符串提供,我大概可以在调用self.wfile.write. 这听起来对吗?

    • 3b。但是当在 *nix 系统上执行 run_cgi() 时,脚本由分叉的进程执行。我认为孩子的标准输出会直接写入 self.wfile (我对此有点模糊),所以我看不到 run_cgi() 中的代码检查输出的机会。啊。有什么建议么?

  4. 如果建议分析脚本的输出,那么 email.parser 是识别是否有content-type标头的标准方法吗?是否建议使用另一个标准模块?

  5. 是否有更合适的论坛来询问主要问题(“基于 CGIHTTPRequestHandler 的 CGI 服务器如何要求......”)?询问是否有比 Stack Overflow 更好的编程问题论坛似乎很奇怪,但我想一切皆有可能。

谢谢你的帮助。

4

0 回答 0