基于cgihttpprequesthandler的CGI服务器如何要求脚本用包含“contenttype”的头启动响应?

2024-09-29 19:18:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

以下是背景:对于一门介绍性的comp-sci课程,学生们使用讲师提供的服务器开发html和服务器端python2.7脚本。该服务器基于cgihttpprequesthandler,就像位于pointlessprogramming的服务器。当学生的html和脚本看起来正确时,他们将这些文件移植到一个远程的、速度较慢的Apache服务器。为什么支持两台服务器?好吧,使用本地服务器的初始开发有助于减少网络问题和对运行Apache的远程、弱机器的依赖。最终移植到运行Apache的机器上的好处是将结果发布给其他人看。在

为了使本地开发最有用,本地服务器应该与Apache服务器非常相似。目前有一个重要的区别:Apache要求脚本用包含content-type的头来启动响应;如果脚本不能提供这样的头,Apache会向客户端发送一个500错误(“Internal Server error”),这对于不能使用服务器日志的学生来说太普遍了。cgihttpprequesthandler没有提出类似的要求。因此,对于一个学生来说,编写与本地服务器一起工作的无头脚本是很常见的,但是在将文件复制到Apache服务器之后会出现令人困惑的500个错误。如果有一个本地服务器的版本来检查content-type报头,如果没有报头,会给出一个很好的错误。在

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

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

  2. 要创建一个检查content-type报头的本地服务器,也许我应该使用子类CGIHTTPServer.cgihttpprequesthandler,以使用对丢失的标头发出错误的版本重写run_cgi()。我在看CGIHTTPServer.py__version__ = "0.4",它是与python2.7.3一起安装的。但是run_cgi()要进行大量的处理,所以复制它的所有代码有点不吸引人,只需要向头检查例程添加几个调用。有更好的方法吗?

  3. 如果对(2)的回答是“否,建议重写run_cgi()”,那么我预期编写一个调用所需脚本的版本,然后在将输出发送到客户端之前检查脚本输出的头。显然,在现有的run_cgi()中有两个地方调用脚本:

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

    • 但是当run_cgi()在*nix系统上执行时,脚本是由一个分叉的进程执行的。我想孩子的stdout会直接写信给self.wfile文件(我对此有点模糊),所以我认为run_cgi()中的代码没有机会检查输出。啊。有什么建议吗?

  4. 如果建议分析脚本的输出,则电子邮件.parser识别是否存在content-type报头的标准方法?是否建议使用另一个标准模块?

  5. 有没有更合适的论坛来问主要问题(“基于cgihttpprequesthandler的CGI服务器如何需要…”)?问是否有比堆叠更好的论坛来提问编程问题似乎很奇怪但我想一切皆有可能。

谢谢你的帮助。在


Tags: 文件run服务器脚本标准apachetype错误

热门问题